linux命令行bandit使用練習(xí)實(shí)戰(zhàn)
引言
linux命令很久沒用了,最近重新復(fù)習(xí)一下,找到了一個(gè)wargames系列游戲,可以按照要求進(jìn)行相關(guān)命令行操作,從而通關(guān)游戲,先從Bandit開始
Level 0~3 (ls)
按要求連接bandit.labs.overthewire.org
,端口號2220
ssh bandit0@bandit.labs.overthewire.org -p 2220 password: bandit0
Level 1~2僅需cd
到對應(yīng)文件夾,cat
查看即可,Level3需要查看隱藏文件,ls -a
找到隱藏文件即可。
密碼如下:
lv1: NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL
lv2: rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
lv3: aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
lv4: 2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe
Level 4~7 (grep + find)
Level 4 查找 human-readable文件
這里密碼是/^[0-9a-zA-Z]$/
格式,因此grep過濾內(nèi)容,命令如下:
grep -rE "^[0-9a-zA-Z]+$" ./inhere/
Level 5~7條件查找過濾
level5條件如下:
- human-readable
- 1033 bytes in size
- not executable
按過濾的效率,先對比size,再過濾不能執(zhí)行的,最后用grep過濾內(nèi)容,命令如下:
find ./inhere/ -type f -size 1033c ! -executable -exec grep -rE "^[0-9a-zA-Z]+$" {} +
level6過濾條件如下:
owned by user bandit7
owned by group bandit6
33 bytes in size
命令如下(因?yàn)槭蔷毩?xí)題,所以換成管道的寫法,實(shí)際上這里用這種寫法效率并不高):
find / -type f -size 33c -user bandit7 -group bandit6 | xargs -I{} grep -rE "^[0-9a-zA-Z]+$" {}
但這樣又有一個(gè)問題,打印內(nèi)容中大量Permission denied
,這是因?yàn)閒ind從根目錄開始找,會(huì)找到很多無權(quán)訪問的文件,因此需要將錯(cuò)誤重定向,寫法如下:
find / -type f 2>>/dev/null -size 33c -user bandit7 -group bandit6 | xargs -I{} grep -rE "^[0-9a-zA-Z]+$" {}
這里2>>/dev/null
是一種重定向操作符,它將標(biāo)準(zhǔn)錯(cuò)誤(stderr)輸出重定向到 /dev/null
設(shè)備。 /dev/null
是一個(gè)特殊設(shè)備文件,它會(huì)將所有寫入它的數(shù)據(jù)丟棄掉,不做任何處理,如果指向的是具體的文件,錯(cuò)誤將會(huì)被寫入該文件中,可用于錯(cuò)誤日志。
level7過濾條件如下:
- in data.txt
- next to the word millionth
直接上手,寫的命令如下
grep "millionth.*" ./data.txt
但這種寫法輸出是millionth xxxxx
,雖然可以得到密碼,但我們其實(shí)僅需要密碼部分,更精準(zhǔn)的寫法如下:
grep "millionth.*" ./data.txt | cut -f 2 # or grep -oP "millionth\s+\K.+" ./data.txt
前一種寫法代表將查找結(jié)果分割,獲取第二列。后一種寫法是獲取正則的捕獲組,grep -E
的正則貌似沒法獲取捕獲內(nèi)容,而-p
采用Perl
的正則語法,\K
獲取捕獲組,配合-o
輸出捕獲組
lv5: lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
Lv6: P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
lv7: z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
lv8: TESKZC0XvTetK0S9xNwm25STk5iWrBvP
Level8~ 12(awk uniq sort tr..)
level8 查找不重復(fù)的行
題目要求在data.txt中找到唯一不重復(fù)的行。
因?yàn)閘inux命令不熟,所以一上手就想著用awk
解決問題,思路比較簡單,先用一個(gè)cache
統(tǒng)計(jì)每行字段的出現(xiàn)次數(shù),再從cache
中找到count
為1的字段,代碼如下:
awk '{ cache[$0] = cache[$0] + 1; } END { for(s in cache) { if(cache[s]==1) { print s exit } } }' ./data.txt
但看題目下面的提示,提到了uniq
和sort
,查看uniq
文檔,雖然uniq
可以統(tǒng)計(jì)詞頻,甚至直接顯示僅出現(xiàn)一次的行,但當(dāng)重復(fù)的行并不相鄰時(shí),uniq 命令是不起作用的,這樣設(shè)計(jì)很好理解,若uniq
可以處理不相鄰的重復(fù)字段,那必然需要對整個(gè)文件字段進(jìn)行緩存,這種操作顯然是不太有利于流文件的處理,這種原子級的命令應(yīng)優(yōu)先考慮性能,功能可以通過命令之間的組合實(shí)現(xiàn)。因此要先用sort
去對內(nèi)容進(jìn)行排序,最終代碼如下:
sort ./data.txt | uniq -u
level9 在文件中密碼
密碼的條件:
- 密碼前面有幾個(gè)"="
- 密碼是human readable的
不難寫出如下代碼:
grep -aoP "={2,}\s*\K[0-9a-zA-Z]+" ./data.txt
這里先要給grep
加上-a
指令符,因?yàn)?code>data.txt中有二進(jìn)制內(nèi)容
Level 10密碼經(jīng)過了base64加密
base64 -d ./data.txt
Level 11 內(nèi)容解碼
這里題目比較難理解,所有字母都旋轉(zhuǎn)了13個(gè)位置,但通過cat ./data.txt
查看文檔,會(huì)發(fā)現(xiàn)文檔內(nèi)容如下:
Gur cnffjbeq vf WIAOOSFzMjXXBC0KoSKBbJ8puQm5lIEi
根據(jù)前面幾題的結(jié)果,比較容易猜測前三個(gè)單詞是The password is
, 數(shù)字對的上,那么規(guī)則也比較好猜了,就是將a-z形成一個(gè)環(huán)形鏈表,這里的旋轉(zhuǎn)指的是旋轉(zhuǎn)環(huán)形鏈表的位置,注意這里說的是字母而非數(shù)字
用awk實(shí)現(xiàn),代碼如下:
awk ' BEGIN { for(i=65;i<=122;i++) { ord[sprintf("%c", i)]=i } } function transform(str, offset) { cache="" len=length(str); for(i=1;i<=len;i++) { w=substr(str,i,1); word=w if(match(w,/[a-zA-Z]/)){ n=ord[w] start=97; end=122; if(n>=65 && n<=90) { start=65; end=90; } count=n - offset; if(count<start) { count=end + (count-start + 1) } word=sprintf("%c", count) } cache=sprintf("%s%s", cache, word) } return cache } { offset=13; str=$0; transStr=transform(str, offset) } END { print transStr }' ./data.txt
awk
對linux
命令不熟悉的人比較友好,但這么實(shí)現(xiàn)實(shí)在太長了。。。
關(guān)于awk腳本
一開始實(shí)現(xiàn)這段腳本的時(shí)候,以為awk后面接的腳本字符串,被awk解釋器解析完之后會(huì)轉(zhuǎn)換成shell或者c語言執(zhí)行,所以下意識感覺sprintf基本規(guī)則和printf類似,因此字母轉(zhuǎn)ASCII碼想著通過word=sprintf("%d", "a")
實(shí)現(xiàn),但最后打印出來word
是0。仔細(xì)一想awk
解釋器之所以是解釋器,而不是編譯器,是因?yàn)樗⒉粫?huì)走完整的解析->遍歷->編譯的流程,應(yīng)該是邊解析邊執(zhí)行的,遇到sprintf
或許會(huì)將其解析為printf
行為,但遇到參數(shù)%d
后,下一個(gè)參數(shù)走的應(yīng)該是走的整數(shù)類型的解析,或許就是這里將非整數(shù)類型的對象直接轉(zhuǎn)換成0了。
tr命令
用命令的話,tr
命令可進(jìn)行替換,思路差不多,先獲取偏移后的字符串,再進(jìn)行替換。。
cache=$(echo {a..z} | tr -d " "); printf -v cache "${cache:13}${cache:0:13}"; cacheUpper=$(echo $cache | tr 'a-z' 'A-Z'); tr "[a-z][A-Z]" "[$cache][$cacheUpper]" < ./data.txt;
lv9: EN632PlfYiZbn3PhVK3XOGSlNInNE00t
lv10: G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
lv11: 6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
lv12: JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
以上就是linux命令行bandit使用練習(xí)實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于linux命令行bandit的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
輸出執(zhí)行操作和打印日志的shell腳本實(shí)例
下面小編就為大家?guī)硪黄敵鰣?zhí)行操作和打印日志的shell腳本實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03Shell腳本傳遞參數(shù)的4種方式實(shí)例說明
Shell腳本是一種命令語言,可以用于自動(dòng)化執(zhí)行各種任務(wù),在腳本中,我們可以通過參數(shù)來傳遞信息,本文將介紹如何在shell腳本中傳遞參數(shù),包括位置參數(shù)、特殊變量、環(huán)境變量和命名參數(shù),需要的朋友可以參考下2023-06-06Shell腳本實(shí)現(xiàn)硬盤空間和表空間的使用情況統(tǒng)計(jì)并郵件通知
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)硬盤空間和表空間的使用情況統(tǒng)計(jì)并郵件通知,其中表空間是指oracle數(shù)據(jù)庫里的表空間,需要的朋友可以參考下2014-12-12Linux執(zhí)行.sh文件時(shí)提示No such file or directory該怎么辦(三種解決辦法)
本文通過三種方法給大家介紹Linux執(zhí)行.sh文件,提示No such file or directory錯(cuò)誤的解決辦法,感興趣的朋友跟著小編一起學(xué)習(xí)學(xué)習(xí)吧2015-10-10