shellcode_linux_x86_64
[TOC]
本文是我的另一篇文章的精简版,删除了参考文章,以及一些额外的解释,只保留了最关键的部分。如想学习写shellcode,可以去阅读 Linux_shellcode开发之实战
0. README
下列文章中的汇编代码,用下面的命令编译运行:
注意:这里和下面的 fileName,都要用实际相应的文件名替换。
用下面这串命令,来自动提取机器码:
|
|
注意:提取出的机器码放在 c语言代码的 shellcode[] 这个常量数组中。
搭建好的 c语言代码,用下面的命令编译运行:
以下,只提供汇编代码,相应参数我会在代码头做相应注释。
1. 打开 terminal
0x1
|
|
0x2
|
|
0x3
cdq的作用无非就是将一个32位有符合数扩展为64位有符合数,数据能表示的数不变,具体是这样实现的,比如eax=fffffffb(值为-5),然后cdq把eax的最高位bit,也就是二进制1,全部复制到edx的每一个bit位,EDX 变成 FFFFFFFF,这时eax与edx连起来就是一个64位数,FFFFFFFF FFFFFFFB ,它是一个 64 bit 的大型数字,数值依旧是 -5
2. 重启 reboot
|
|
3. 关闭防火墙(清空 iptable)
|
|
4. passwd
4.1 读取 passwd
cat 读取
|
|
系统调用读取
|
|
4.2 写入 passwd
0x1
|
|
0x2
|
|
5. 反向 shell
5.0 部署
【1】先在攻击端(kali: 192.168.188.141)输入以下命令。
【2】然后在靶机端(Kylin:192.168.188.146)运行shellcode
5.1 netcat 命令行
由于 kylin 上原装的 netcat 是阉割版本,没有 -e 参数的,我们先需要安装完整版的 netcat。我将它安装在 /home/sakura/tools/netcat 目录下。
安装教程: 这可能是netcat最全的使用指南
|
|
5.2 系统调用
|
|
6. 提权方法
6.1 bash
|
|
6.2 nmap
判断nmap版本,nmap -v
,如果版本在2.02至5.21之间,则可以提权
6.3 find
6.4 vim
利用vim提权的思路是修改etc/passwd文件,为自己添加一个有root权限的用户
7. 关闭 ASLR
配置选项
- 0 = 关闭
- 1 = 半随机。共享库、栈、mmap() 以及 VDSO 将被随机化。(留坑,PIE会影响heap的随机化。。)
- 2 = 全随机。除了1中所述,还有heap。
方法一: 手动修改randomize_va_space文件
|
|
注意,这里是先进root权限,后执行。不要问为什么sudo echo 0 > /proc/sys/kernel/randomize_va_space为什么会报错
方法二: 使用sysctl控制ASLR
|
|
这是一种临时改变随机策略的方法,重启之后将恢复默认。如果需要永久保存配置,需要在配置文件 /etc/sysctl.conf 中增加这个选项。
方法三: 使用setarch控制单个程序的随机化 如果你想历史关闭单个程序的ASLR,使用setarch是很好的选择。setarch命令如其名,改变程序的运行架构环境,并可以自定义环境flag。
|
|
-R参数代表关闭地址空间随机化(开启ADDR_NO_RANDOMIZE)
方法四: 在GDB场景下,使用set disable-randomization off
在调试特定程序时,可以通过 set disable-randomization
命令开启或者关闭地址空间随机化。默认是关闭随机化的,也就是on状态。
当然,这里开启,关闭和查看的方法看起来就比较正规了。
关闭ASLR:
|
|
开启ASLR:
|
|
查看ASLR状态:
|
|