本章节收录代码和命令执行漏洞
通用漏洞
- open函数利用
-
案例1:【ruby】NET::Ftp模块在打开文件时用的
open函数,而不是File.open,通过传入| os command可执行任意命令- open(localfile, "w")
-
案例2:【perl】Sophos UTM是perl实现的,调用
open函数时,文件名可被用户控制,也有| os command的问题- open my $fh,
$ARGV[0] or die $ !;
- open my $fh,
-
案例1:【ruby】NET::Ftp模块在打开文件时用的
- 参数注入
-
案例1:【iot】Moxa AWK-3131A在执行登陆操作时,会调用命令行程序验证账号密码。这里没有使用execve,而是直接使用system执行,造成命令注入
- sprintf(buf, "/usr/sbin/iw_event_user %s %s %s", IW_LOG_AUTH_FAIL);
- system(buf)
-
案例2: TexLive支持
repstopdf [options] [epsfile [pdffile.pdf]]指令来生成PDF。repstopdf是一个perl脚本,通过执行ghostscript命令来生成PDF- repstopdf在执行命令时为了提升安全性,增加了
--safer参数,并过滤了--gsopt/--gsopts/--gscmd等危险参数 - 但由于PDF文件名参数epsfile会被放到
-sOutputFile=XXX里,且这里支持使用管道,e.grepstopdf '|id #',最终导致命令注入漏洞
- repstopdf在执行命令时为了提升安全性,增加了
- 案例3:【iot】GoAhead set_ftp.cgi接口先生成一个shell脚本再执行。用户的输入在
/system/system/bin/ftp -n<<EOF与EOF之间,由于没有使用'EOF',所以会解析变量,存在命令注入问题 -
案例4:【iot】SSL VPN调用tcpdump时存在命令注入,最后注入
-r参数让tcpdump报错,并重定向stderr生成perl webshell,实现漏洞利用。内容在PPT 91-95页- 利用限制
- 过滤了
&|*()..等各种特殊字符 - tcpdump版本太低,不支持
-z参数
- 过滤了
- 技巧
- perl支持标签语法,e.g
error: print 0x41 - 最终payload是
-r 'print 123#' 2>/xxxx/setcookie.html.ttc
- perl支持标签语法,e.g
- 利用限制
-
案例5:【linux】kibana nodejs原型链污染 + 通用的 child_process.spawn env污染实现RCE
- timelion页面可以控制Object的原型链,并污染env的值
- canvas页面会调用child_process.spawn()启动新的node进程
- spawn方法会将options.env透传给子进程,由于前面通过原型链控制了NODE_OPTIONS和AAA两个环境变量,可以实现RCE
- 案例6:【mac】hdiutil可以生成带有换行符的磁盘名,timemachinehelper会拼接这个名字,并传递给awk执行。通过换行符+$()可以实现命令注入
- 案例7:【iot】IOT设备扫描SSID、或者连接时,会调用底层命令,SSID、加密方式等字段都有可能造成命令注入 - 详情在第55页
- 案例8:【android】EMUI保存主题时候会先用
renameTo(),失败了再执行mv命令。命令注入时不能出现/,用${ANDROID_DATA%data}构造一个就可以了 - 案例9: Evinceh会拼接文件名到tar解压缩命令里,在文件名里加上
--checkpoint-action字样可以实现命令注入 - 案例10: NagiosXI错误的使用了escapeshellcmd去转义命令行参数,可以注入不带引号的参数,通过注入
-o XXX到curl命令,可以实现getshell
-
案例1:【iot】Moxa AWK-3131A在执行登陆操作时,会调用命令行程序验证账号密码。这里没有使用execve,而是直接使用system执行,造成命令注入
- 下游命令执行
- 配置校验不足
- 基于chrome的浏览器利用
git利用
- 案例1: 使用
--output=/XXX写文件,比如github企业版可以在env.d创建一个新的启动脚本 - 案例2: 使用
--no-index跟源码目录以外的文件进行对比,通过读取diff结果,可以实现任意文本文件读取 - 案例3: git archive会调用
sh -c,比如通过--prefix xd --exec='echo pew#' --remote=file:///tmp/ -- blah执行命令 - 案例4: git --upload-pack 注入
- 案例5: git clone注入ssh
-oProxyCommand参数实现RCE,可以在LFS或者submodule上触发漏洞,目前已经修复
Electron利用
- 案例1: VSCode 1.19.0~1.19.2默认带有
--inspect启动,导致调试模式开启,可执行任意代码 - 案例2: CVE-2018-1000006案例,程序注册URL协议,比如
c:\a.exe "%1"。explorer会调用ShellExecuteW执行,而且%1里面的双引号可以被闭合掉,然后实现参数注入、命令执行;ShellExecuteW使用域名+..\跳出目录的问题,在Windows 2022已经无法复现
Mac案例
待补充
- 根据配置加载DLL
待补充