【社工进阶】如何通过Twitter社交软件进行社工

杂谈

之前我们讲了很多基于OSINT(开源情报)框架下的内容,例如

当然,我们也整理了一份完整思路,如果您感兴趣也可以看下

2022社工相关内容汇总

即日起,我们将针对社交软件给大家提供一些思路和工具,今天我们先分享一下twitter的社工技巧吧!

(如果上不了twitter,记得先学习一下科学上网

图片[1]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

下面的工具最大的优势就是不基于twitter的api,纯python爬虫实现的,所以超级强大!

视频教程

视频里的方法是直接使用的国外的服务器,因此无需科学上网,直接输入命令就好了!

(福利:您可以点这里领取到vultr 100美元体验券,可以白嫖一年最低配的国外服务器)

勘误说明:视频中是clear清屏 口误打成clean了😅

工具安装

方法一:从git上clone

git clone --depth=1 https://github.com/twintproject/twint.git
cd twint
pip3 install . -r requirements.txt

方法二:Python下的twint模块安装(视频中使用的下面这种方法)

安装twint模块

pip3 install --upgrade git+https://github.com/twintproject/twint.git@origin/master#egg=twint

部分运行出现报错,则需要修改token.py

具体每个人的环境不同(我的是在/usr/local/lib/python3.6/site-packages/twint/token.py下面)

import re
import time

import requests
import logging as logme


class TokenExpiryException(Exception):
    def __init__(self, msg):
        super().__init__(msg)


class RefreshTokenException(Exception):
    def __init__(self, msg):
        super().__init__(msg)


class Token:
    def __init__(self, config):
        self._session = requests.Session()
        self._session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'})
        self.config = config
        self._retries = 5
        self._timeout = 10
        self.url = 'https://twitter.com'

    def _request(self):
        for attempt in range(self._retries + 1):
            # The request is newly prepared on each retry because of potential cookie updates.
            req = self._session.prepare_request(requests.Request('GET', self.url))
            logme.debug(f'Retrieving {req.url}')
            try:
                r = self._session.send(req, allow_redirects=True, timeout=self._timeout)
            except requests.exceptions.RequestException as exc:
                if attempt < self._retries:
                    retrying = ', retrying'
                    level = logme.WARNING
                else:
                    retrying = ''
                    level = logme.ERROR
                logme.log(level, f'Error retrieving {req.url}: {exc!r}{retrying}')
            else:
                success, msg = (True, None)
                msg = f': {msg}' if msg else ''

                if success:
                    logme.debug(f'{req.url} retrieved successfully{msg}')
                    return r
            if attempt < self._retries:
                # TODO : might wanna tweak this back-off timer
                sleep_time = 2.0 * 2 ** attempt
                logme.info(f'Waiting {sleep_time:.0f} seconds')
                time.sleep(sleep_time)
        else:
            msg = f'{self._retries + 1} requests to {self.url} failed, giving up.'
            logme.fatal(msg)
            self.config.Guest_token = None
            raise RefreshTokenException(msg)

    def refresh(self):
        logme.debug('Retrieving guest token')
        res = self._request()
        match = re.search(r'\("gt=(\d+);', res.text)
        if match:
            logme.debug('Found guest token in HTML')
            self.config.Guest_token = str(match.group(1))
        else:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
                'authority': 'api.twitter.com',
                'content-length': '0',
                'authorization': self.config.Bearer_token,
                'x-twitter-client-language': 'en',
                'x-csrf-token': res.cookies.get("ct0"),
                'x-twitter-active-user': 'yes',
                'content-type': 'application/x-www-form-urlencoded',
                'accept': '*/*',
                'sec-gpc': '1',
                'origin': 'https://twitter.com',
                'sec-fetch-site': 'same-site',
                'sec-fetch-mode': 'cors',
                'sec-fetch-dest': 'empty',
                'referer': 'https://twitter.com/',
                'accept-language': 'en-US',
            }
            self._session.headers.update(headers)
            req = self._session.prepare_request(requests.Request('POST', 'https://api.twitter.com/1.1/guest/activate.json'))
            res = self._session.send(req, allow_redirects=True, timeout=self._timeout)
            match = re.search(r'{"guest_token":"(\d+)"}', res.text)
            if match:
                logme.debug('Found guest token in JSON')
                self.config.Guest_token = str(match.group(1))
            else:
                self.config.Guest_token = None
                raise RefreshTokenException('Could not find the Guest token in JSON')

实战案例

以下内容,我们默认您已经下载好了相关的python脚本

今天,我们要社工的对象,是黑寡妇(Scarlett Johansson)~

图片[2]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

我们先找到twitter的地址(我们发现寡姐并没有twitter认证的账户,因此我们只能从粉丝账户里寻找一些信息了)

https://twitter.com/Scarlett_Jo

https://twitter.com/BestfScarlett

(访问不了的请科学上网

图片[3]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

由于以下内容是实战部分,如果你想借用命令,请记得将BestfScarlett改成你要搜寻的用户名

首先,我们可以先收集一下寡姐之前发过的全部推特内容

twint -u BestfScarlett
图片[4]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

但是这样并不高效,因为一个人的推文有很多,这时,我们可以做一些筛选!

根据点赞数、评论、转发数筛选

例如,我们只看点赞数超过500的

twint -u BestfScarlett --min-likes=500
图片[5]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

或者,我们只看评论超过10的

twint -u BestfScarlett --min-replies=10
图片[6]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

链接一般在一条的最后面,随便打开一个

图片[7]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

或者,我们只看转发量超过100的

twint -u BestfScarlett --min-retweets=100
图片[8]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

根据时间维度筛选

当然,我们还可以做到更精细,比如我们想看寡姐2021年之前发过的内容,我们可以这样

twint -u BestfScarlett --year 2021
图片[9]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

某个日期后发送的内容,比如在《复联4》在美国上映后(2019年4月26日),我想看看寡姐的推文

twint -u BestfScarlett --since 2019-4-26

某个时间点之后发送的内容,例如在2019-04-26 20:30:15之后发布的内容

twint -u BestfScarlett --since "2019-04-26 20:30:15"

社工进阶

  • 关键词索引

我这里下搜索twitter整个社交平台下,关于 寡姐(Scarlett Johansson)的资料

twint -s Scarlett

然后你可以看到全球用户发布的与其相关的内容

图片[10]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog
  • 关键词配合twitter号索引

我这里想搜索寡姐(Scarlett Johansson)中与美队相关的内容(关键词我们这里就写Captain就行)

twint -u BestfScarlett -s Captain
  • 关键词配合认证twitter账户索引

比方说,我这里想搜索寡姐(Scarlett Johansson),而且来源要是认证账户的

twint -s "Scarlett Johansson" --verified
图片[11]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

  • 泄露手机号、邮件信息索引

我们可以通过下面的命令来检测寡姐(Scarlett Johansson)的手机号、邮箱等资料是否曾泄露于她之前的推文中

检测邮件泄露的命令

twint -u BestfScarlett --email

检测手机号泄露的命令

twint -u BestfScarlett --phone

我们这里没有检测到,我们这里换到了寡姐的前夫小贱贱(https://twitter.com/VancityReynolds),我们尝试一下

图片[12]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog
twint -u VancityReynolds --email
图片[13]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

居然真的可以检测到泄露的邮件账户地址

导出数据

导出数据只是命令中的一个附加参数,相当于之前我们的命令在后面加上-o相关的命令,也可以导出

(这里假定我们导出的文件名称为file)

  • 导出txt格式 -o file.txt
  • 导出csv格式 -o file.csv –csv
  • 导出json格式 -o file.json –json

当然,这些都是简单的,如果你还想玩点更骚的,还可以直接写到数据库里

  • 写入sqlite数据库中 –database tweets.db
  • 写入es数据库中 -es localhost:9200

写到数据库中玩法就更多样了,你可以通过一些图表,来更清晰地展现这些用户画像,用户之间的关系以及发送推文的报表,深层次的玩法,我们以后讲!大家可以期待一下!

图片[14]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog
图片[15]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog
图片[16]-【社工进阶】如何通过Twitter社交软件进行社工-FancyPig's blog

下面我们将配合实际的功能,跟大家说下如果我想把用户的一些资料导出到json文件中,应该怎么做?

导出粉丝列表

如果你想看哪些用户关注了寡姐,可以通过下面的命令导出到Scarlett_followers.json文件中

一般在社工中我们不这么操作,她的粉丝数太多了,这样做一般意义不大!

twint -u Scarlett_Jo --followers -o Scarlett_followers.json --json

导出TA的关心用户

如果你想看寡姐关注了谁,可以通过下面的命令导出

twint -u BestfScarlett --following --user-full -o Scarlett_folloing.json --json

导出最近900条推文

twint -u BestfScarlett --following --user-full -o Scarlett_latest_post.json --json

导出TA喜欢的文章

twint -u BestfScarlett --favorites -o Scarlett_favorites.json --json

© 版权声明
THE END
喜欢就支持一下吧
点赞53赞赏 分享
评论 共9条

请登录后发表评论