Bandit破解


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}'

後來發現這樣的匹配效果有三點不好:

  1. 沒找到ls命令有顯示以byte爲單位的文件大小的,所以1K的範圍取得有點寬了
  2. 通過awk輸出的只有文件名,並不知道該文件的完整路徑,所以文件定位困難
  3. 通過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中看到密碼了。


bandit25密碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章