:
http://overthewire.org/wargames/bandit/
ssh地址:bandit.labs.overthewire.org
bandit0密碼:bandit0
bandit1密碼:boJ9jbbUNNfktd78OOpsqOltutMc3MY1
bandit2密碼:CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
可以用scp命令將該文件下載到有圖形界面的本地,然後打開。
但是這個渠道不是官方希望做的方式,所以最好學習一下怎麼在命令行下操作“-”文件。
(-。-;),可以通過在“-”文件前面加上絕對/相對路徑的方式。比如~/-的文件,可以用/home/user/-來使用cat訪問,這樣就不會出現歧義的情況了。不過關於如何處理特殊字符的文章還是需要好好看一下:http://tldp.org/LDP/abs/html/special-chars.html
bandit3密碼:UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
這次的文件是帶空格的,直接用Tab鍵就可以了,或者空格前面加上轉義字符“\”
bandit4密碼:pIwrPrtPN36QITSp3EQaw936yaFoFgAB
隱藏文件而已。
bandit5密碼:koReBOKuIDDepwhWk7jZC0RTdopnAYKh
事實上是這些文件裏面包含了有用的密碼信息,我不知道是不是應該做轉碼,不過在vi下用”set encoding=utf-8”這類的轉碼命令並沒有看到什麼東西,後來想到用cat命令將文件整合:
cat inhere/*
bandit6密碼:DXjZPULLxYr17uwoI01bNLQbtFemEgo7
提示說密碼放在了human-readable,大小是1033b,不能執行的文件裏。所以要對文件做過濾操作,human-readable就不說了,文件大小和不可知性的屬性這兩點要能夠過濾掉,而且如果返回結果比較多的話,最好還能用返回完整的文件路徑,這樣方便統一定位文件做cat
。
剛開始,試了ls+grep+awk的組合:
ls -la --block-size=K maybe* | grep -v "x" | grep "1K" | awk '{print $1, $9}'
後來發現這樣的匹配效果有三點不好:
- 沒找到
ls
命令有顯示以byte爲單位的文件大小的,所以1K的範圍取得有點寬了 - 通過
awk
輸出的只有文件名,並不知道該文件的完整路徑,所以文件定位困難 - 通過
grep
的逆向過濾選項-v
將表示可執行權限的關鍵字母“x”過濾掉了,這裏屬於特殊情況,因爲如果文件名中包含“x”,則也會被過濾掉。
在網上搜了一下,發現可以通過ls -l | awk '{print i$0}' i=`pwd`
這樣的命令顯示文件完整路徑,因此改進上述的命令:
ls -la --block-size=K maybe* | grep -v "x" | grep "1K" | awk '{print $1, i$9}' i=`pwd`
發現這樣仍然不能準確定位。後來就想換一種方法,使用find
命令。初步使用了:
find . -depth -size 1033c
# -depth表示往目錄下搜索,-size表示文件大小,1033c表示1033bytes
其實這個仍然沒有過濾掉可執行文件屬性,但是嘗試出來的結果只有一個,所以就直接看這個文件內容了。
bandit7密碼:HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
所屬用戶是bandit6,所屬用戶組是bandit7,大小是33bytes的文件。
find / -size 33c -group 'bandit6' -user 'bandit7' | grep -v 'denied'
上面的命令使用grep的逆向匹配企圖過濾掉“Permission denied”的輸出,但是這個輸出是標準錯誤輸出,grep簡單命令不能處理。因此,採用了下述的方法:
find / -user bandit7 -group bandit6 -size 33c -type f 2>/dev/null
其中-type f
表示類型是文件,2>/dev/null
表示將標準錯誤輸出重定向到/dev/null
設備,也就是丟棄。
bandit8密碼:cvX2JJa4CFALtqS87jk27qwqGhBM9plV
cat data.txt | grep millionth -n1
bandit9密碼:UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
要求是找出data.txt
文件中不重複出現的一行。首先,要對文件中的行做排序,使得重複出現的行能夠相鄰出現,然後才能用uniq
命令的-u
選項去除重複的行。
sort data.txt | uniq -u
bandit10密碼:truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
之前一直沒理解human-readable什麼意思,剛發現有一個strings
的命令,可以從文本中找到可讀的文字。同時,用到了正則表達式,匹配開始字符是“=”的行。
cat data.txt | strings | grep '^[=]'
bandit11密碼:IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
提示要用base64解碼出有意義的內容,命令如下:
cat data.txt | base64 -d | strings
bandit12密碼:5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
看起來是凱撒密碼的簡單解密,大小寫字母分別是其後的第13個循環的字母,不知道循環+12怎麼弄,就直接寫上了字母對應的字符串,用tr
命令做了替換。
cat data.txt | tr [a-zA-Z] "mnopqrstuvwxyzabcdefghijklMNOPQRSTUVWXYZABCDEFGHIJKL"
突然想起來,也可以這麼表示。。。
cat data.txt | tr [a-z] [n-za-m] | tr [A-Z] [N-ZA-M]
這兩個都能輸出正確結果,不過不明白的是爲什麼一個是從m開始,另一個是從n開始?
bandit13密碼:8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
打開文件,發現內容是xxd導出的文件格式。其實也不是我發現,這是新技能get。我剛開始還想着把裏面中間幾列的16進制數據拿出來作爲十六進制文件呢。不過我忘了裏面的所謂16進制內容是用ascii碼錶示的。所以,先用xxd
命令:
xxd -r data.txt data
然後用hexdump或者xxd命令查看文件頭:
- 如果是0x1f8b開頭的,就是gz壓縮,使用
gzip -d data.gz
- 如果是0x425a開頭的,就是bzip2壓縮,使用
bzip2 -d data.bz2
- 如果兩者都不是,則應該是tar打包,使用
tar -xvf data.tar
如此層層循環,最終就能解出來最終的密碼了。
注意,每次判斷出文件類型以後最好用mv
命令給文件重命名,加上其後綴名,這樣便於識別。其次,把data.txt文件放到/tmp目錄下,再新建一個目錄,這樣方便進行文件等的操作。因爲遠程主機已經關閉了查看其他文件的權限,直接在/tmp下是無法使用ls
命令的。
bandit14密碼:4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
這次要求使用私鑰登陸bandit14,然後獲取目錄/etc/bandit_pass/bandit14
文件中存儲的bandit14的密碼。由於沒有存儲其他地址主機的公鑰,因此只能本地登陸bandit14賬戶,命令爲:
ssh bandit14@localhost -i .sshkey.private # -i選項指定私鑰文件
# 成功登錄到bandit14以後
cat /etc/bandit_pass/bandit14
bandit15密碼:BfMYroe26WYalil77FoDi9qh59eK5xNr
提示向端口30000提交bandit14的密碼。剛開始沒搞明白怎麼提交,用ssh和telnet都試過了,telnet通過,然後獲取到了密碼。
telnet localhost 30000
命令提示有讓用nmap
,不過沒有用到。用tcp連接掃描端口的命令:
nmap -v -sT localhost # -v表示顯示更多信息,-sT表示TCP connect scan。此外,還有-sS表示TCP SYN scan,-sU表示UDP scans
bandit16密碼:cluFn7wTiGryunymYOu4RcffSxQluehd
是因爲提示太明確了嗎?我基本上都沒有用到什麼openssl
的功能。
openssl s_client -connect localhost:30001
# openssl命令的用法格式是 openssl
# s_client是一種command,模擬了一個通用的SSL/TLS客戶端,能夠和遠端服務器使用SSL/TLS建立連接。這個僅僅是做連接測試用的,只實現了基本的功能。此外,還有模擬服務器的s_server
提示裏說:Helpful note: Getting “HEARTBEATING” and “Read R BLOCK”? Use -ign_eof and read the “CONNECTED COMMANDS” section in the manpage. Next to ‘R’ and ‘Q’, the ‘B’ command also works in this version of that command…
bandit17密碼:
首先,掃描端口:
nmap -v -sT localhost -p31000-32000
得到如下結果:
Not shown: 996 closed ports
PORT STATE SERVICE
31046/tcp open unknown
31518/tcp open unknown
31691/tcp open unknown
31790/tcp open unknown
31960/tcp open unknown
然後挨個測試端口的ssl連接。然後發現31790端口回覆了一個私鑰,用這個私鑰本地登錄bandit17用戶即可。
bandit18密碼:kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
簡單使用diff passwords.old passwords.new
即拿到了密碼。
bandit19密碼:IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
在這個地方陷入了思維誤區,提示說.bashrc中寫入了只要登陸就會被強制登出的功能,所以通過ssh登陸,然後進行操作是不行的,要想拿到正確結果,可以直接用scp拷貝文件到本地。此外,還能在登錄的時候直接進行操作,這個真是新技能get:
ssh [email protected] 'cat readme'
bandit20密碼:GbKksEFF4yrVs6il55v6gwY5aVje5f0j
使用一個腳本而已。
bandit21密碼:gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
就是讓聯繫nc
命令的使用的。要建立服務器監聽端口,然後手動傳送內容。
nc -lp 9999 # 監聽9999端口,等待tcp連接
./suconnect 9999 # 裏面提供的腳本,可以進行tcp連接
# 其實也可以直接用 nc localhost 9999進行連接。
bandit22密碼:Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
定時任務cron,crontab的使用。其實也沒用,就是看了一下而已。發現定時把密碼放到/tmp下的一個文件中去,直接cat
查看即可。
bandit23密碼:jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
同上一個方法一樣,追查到腳本,發現腳本的內容是對一句話做了md5sum,然後用cut
命令切出了以空格爲分隔符的第一部分的字符串作爲/tmp下的文件名。
bandit24密碼:UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
看到會定期執行/var/spool/bandit24/
目錄下的所有文件。所以新建一個腳本,將腳本放到該目錄下,在腳本中實現bandit24密碼的輸出:
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/yyy
稍等片刻就可以在/tmp/yyy
中看到密碼了。