《BLACK HAT PYTHON3》

Black Hat Python3#

kali 安装新版本python

kali中自带的pyhton是2.7版本,显然2019年了,python2.x的版本已经逐渐过时,好多第三方库都逐步宣布不再支持python2.x版本,学习python3是比较明智的选择。

步骤也简单,下载、解压缩、进入目录、配置、编译、安装。注意在进行配置./configure时按照给出的提示信息执行命令。我在make时遇到过错误可能就是没有执行高级configure选项造成的。

具体参考:Linux安装最新版本Python3

kali 安装配置pycharm

linux下好用的IDE并不多,免费的更少,幸亏广受好评的Pycharm可用,传说中的JetBrains大法好···。
pycharm好在哪里呢?就我个人体验而言,首先是极方便的环境管理,安装管理包可谓是傻瓜式;其次是堪称严苛的错误提示或者警告,甚至包含了对代码风格的检查,比如定义函数前一定要空两行,注释符后一定要有空格等,让新手也能写出风格良好的代码;最后则是堪称智能的拼写补齐,在候选列表中会自动把常用的提示提到前面。

安装过程属实简单,官网下载community版,解压后进入bin目录下运行pycharm.sh即可。

pycharm的配置和使用还是有点麻烦,毕竟每种IDE都有不低的学习成本,在学习Pycharm中付出的成本绝对让你觉得物有所值。打开pycharm后选择解释器环境,之前安装好的python3.7可以自动识别到。其次就是掌握运行和在python console中运行的技巧,关于这些网上有大量教程,这里就不再多说了。

kali 安装git并连接github

kali已经自带了git,只需建立和github的链接即可,步骤如下:

  1. 安装并启动ssh服务。
  2. **ssh-keygen -t rsa -C "woider@gmail.com" **生成对应邮箱的ssh-key。注意这一步很关键,简单点的话连按三次回车即可,也可自己输入文件目录文件名自行配置。生成的xxx.pub即为ssh公钥。
  3. 将公钥复制到Github中的ssh-key处。
  4. git clone 仓库到本地。(这个克隆到本地的仓库和github中的仓库是自动关联的)
  5. **git add filename **到缓冲区
  6. git commit -m "message"为上传文件添加说明信息。
  7. git push origin master将文件push到github仓库。

升级代码符合Python3规范

实际上python2.7和python3.x还是有不少区别的,但在本章的代码中主要只需注意两点就好:

  1. print格式
  2. bytes和str类型和互相转换

具体python2.7和pyhton3.x的区别详见:在Python 2.7即将停止支持时,我们为你准备了一份3.x迁移指南

关键代码分析

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

socket.socket()返回套接字对象,可以进行连接、收发、读写。第一个参数为地址簇,AF_INET为ipv4地址,AF_INET6为ipv6地址,AF_UNIX只能够用于单一的Unix系统进程间通信;第二个参数为连接类型,SOCK_STREAM,流式socket,用于TCP连接,SOCK_DGRAM,数据报式socket,用于UDP通信,SOCK_RAW,原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头,SOCK_RDM是一种可靠的UDP形式,即保证交付数据报但不保证顺序,SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。SOCK_SEQPACKET可靠的连续数据包服务。

部分运行结果

TCP客户端和服务端:

![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190317105748753-238420417.png)
![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190317105753719-1955038005.png)

替代netcat的工具:

![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190317105816582-1163509099.png)
![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190317105827136-1905503749.png)

连接接ssh服务器,这个在服务器端应该还需要一些配置,没有运行成功。

![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190317105910608-387460848.png)

代码链接

Black Hat Python3

Chapter3、4##

mail sniffer

现在的邮箱应用我能找到的都是加密传输了,因此相像书中那样直接从抓到的包里获取到用户名和密码信息除非是自己专门搭建一个邮箱服务器,不然很难做到,为了便于理解代码的运行,多添加一个tcp端口观察代码的运行情况,修改后的python3代码如下:

from scapy.all import *
from scapy.layers.inet import TCP, IP


# our packet callback
def packet_callback(packet):
    if packet.haslayer(TCP):
        if packet[TCP].payload:
            mail_packet = str(packet[TCP].payload)
            if "user" in mail_packet.lower() or "pass" in mail_packet.lower():
                print("[*] Server: {}".format(packet[IP].dst))
                print("[*] {}".format(packet[TCP].payload))


print("go!")

# fire up our sniffer
sniff(filter="tcp port 110 or tcp port 25 or tcp port 143 or tcp port 80", prn=packet_callback, store=0)
#sniff(prn=packet_callback, count=0)

可以看到比书中多监测了80端口,运行情况如下:

![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190330182000093-1712764395.png)

arper

本代码运行良好不需要做有技术含量的修改,修改后python3代码见文章最后github链接。
运行状况:

![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190330182005176-1660721356.png)
目标主机arp缓存被更改:
![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190330182009469-2131788676.png)

pic_carve

书上步骤很详细,也无需太多修改,对之前的代码稍作修改使其抓取本机的10000个数据包,然后······

我的kali跑死机了。

干脆重写一个抓取本机数据包的程序。代码如下:

from scapy.all import *
import sys

host = "192.168.2.222"
packet_count = 5000
interface = "eth0"

bpf_filter = "ip host {}".format(host)

try:
    print("[*] Starting sniffer for {} packets".format(packet_count))

    packets = sniff(count=packet_count, filter=bpf_filter, iface=interface)

except KeyboardInterrupt:
    pass

finally:
    # write out the captured packets
    print("[*] Writing packets to arper.pcap")
    wrpcap("arper.pcap", packets)
    sys.exit(0)

然后修改并运行代码,说实话不能算成功,无非是对图片格式的编码解码有问题。自我放弃之下用python2.7去运行原版代码······

也是图片编码存在问题:

![](https://img2018.cnblogs.com/blog/1506386/201903/1506386-20190330182018199-803682880.png)

代码链接

Black Hat Python3 Chapter4

Black Hat Python3 Chapter5

web app mapper

目标地址:http://www.blackfire.mobi (感谢网站作者的分享)
joomla应用下载地址:https://github.com/joomla/joomla-cms (需要用到joomla的目录结构)
代码改为python3代码不需要太多修改,把urllib2的相应函数改为urllib中的相应函数即可。

运行结果:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190404182426491-209661325.png)

content_bruter

目标地址:https://www.jianshu.com
使用字典来源:https://github.com/nathanmyee/SVNDigger

或者:https://github.com/digination/dirbuster-ng

本代码中使用dirbuster-ng/wordlists/small.txt

修改代码需要注意是否使用代码中的extension扩展,这和选用的字典中带不带后缀有关系,其次原代码中对网址的拼接有问题,重写如下:

for brute in attempt_list:
    brute_list = brute.split('\'')
    if len(brute_list) == 3:
        url = "{}/{}{}".format(target_url, brute_list[1], brute_list[2])
    elif len(brute_list) == 2:
        url = "{}/{}".format(target_url, brute_list[1])

运行结果:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190404182435237-1601250909.png)
![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190404182446750-694341363.png)

joomla_killer

测试网址:https://passport.csdn.net/login

字典来源:https://github.com/rootphantomer/Blasting_dictionary
本代码使用:Blasting_dictionary/常用密码.txt
代码修改就不多说了。比较简单,运行结果如下:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190404182454385-1385519299.png)

代码链接

Black Hat Python3 Chapter5

Black Hat Python3 chapter 6、9

第六章代码用到的Jyphon包不支持python3版本,因此本次代码均使用书中原版代码(小幅修改)。

模糊测试

首先配置好jyphon包的路径,之后将bhp_fuzz.py文件加入到工具:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095759435-2045795641.png)

模拟运行结果如下:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095804965-793729677.png)

BING API 反查域名

成功添加该工具:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095810412-817231479.png)

运行结果:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095815703-213154666.png)

可以看到并没有查询得到结果。首先bing search API的网址已经变了,现在网址为:https://api.cognitive.microsoft.com/bing/v7.0/

其次,新版的API已经取消了该搜索功能(至少我是没找到,在bing搜索中按照IP:XXX.XXX.XXX.XXX的方式也得不到有效结果,结果为Ref A: 2EBF0909B997498C843D95CDC73B2946 Ref B: BJ1EDGE0307 Ref C: 2019-04-12T01:19:46Z),因此通过本扩展实现反查域名已经不可行了。需要另求它法。

生成字典

首先由host地址发现拓扑结构:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095825088-1743490864.png)

生成字典:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095830788-104864649.png)

结果如下:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095836004-714903883.png)

好兄弟IE

IE浏览器是目前市场占有率最高的浏览器,为了在ie浏览器完成此实验,不得不重装一个win7虚拟机进行此实验。此部分代码使用python3重写。

书中让我观察浏览器是否有难以理解的动作,确实有,当我进入程序中target_site中的登录界面后,或者我本身就在登录状态,浏览器会不停的刷新回输入账户的界面···

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095844171-105889906.png)
实际上是try部分转为python3后出错了,没有错误提示,改正后运行结果如下:
![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095849733-1792225964.png)

html标签中没有id怎么办

本代码要求比较复杂,首先需要使用keygen.py生成RSA公私钥对,然后使用ie_exfil.py将明文文件名加密后在目标网站以标题的形式发出,之后还可以用decryptor.py解密。

在修改过程中其他的不谈,原程序使用win32com这个包来进行浏览器操作,对于目标网站来说存在以下几个问题:

  • win32com使用id来寻找网页中的标签,但是目标网站中我们需要插入数据的地方没有id
![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095859634-434321648.png)
- win32com在插入数据时使用setAttribute来进行修改,问题在于从网页返回的实例中难以获得有哪些attribute,多次使用dir()命令也没有得到什么有效信息
![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413095904421-1579844324.png)

因此在我的视角中使用书中的win32com包来完成这项工作几乎是不可能的。

因此我用selenium包重写了这个程序,在程序链接中命名为ie_exfil_new.py。更换工具包后一切都变得简单了起来,运行结果如下:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190413101656336-1069390324.png)

仍需要注意的是,selenium操作浏览器需要下载对应浏览器的驱动文件,在64位的iedriver中存在bug,在想IE11浏览器中输入英文字母和数字时会非常缓慢,大约5s才能输入一个字符。

据悉对IE浏览器进行降级或者换用32位的驱动可以解决这个问题,但是我将IE11降级为IE10后依然存在这个问题,也有可能是iedriver和selenium版本不匹配的问题?我只是单纯的下载了最新版没有注意版本是否对应。不过具体怎样其实也不重要了,因为selenium只要有对应浏览器的驱动,可以操作任何浏览器,谁还会去用集万千缺点于一身的IE呢?

代码链接

Black Hat Python3

Black Hat Python3 Chapter7、8

这周第八章第一个代码堪称经典,然而再python3下尝试过各种姿势后不得不放弃,原因如下:
1.pyhook安装繁琐,需要的swig工具试过各种版本后才装好,安装可参照:https://blog.csdn.net/u013560932/article/details/78732250/。也可以下载包到本地进行本地安装。
2.pyhook即便装好后,python3运行依然会有问题,具体体现在进程名称中出现中文时,详见Python的KeyboardSwitch() missing 8解决方法
3.安装2中链接的包时,出现了各种新的问题,尤其是visual c++ 14.0微软官网已经不提供下载了。
部分运行结果:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190419225329380-1172261060.png)
![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190419225353457-817113194.png)
因此本周重点放在了第七章的代码。我做的工作主要有两点: 1.转成python3会在某个文件调用中出现charmap格式无法解码的问题,有人在stack overflow提问过这个问题,但没有有效的解答,我在该问题下做出了回答,详见[Traceback Error: Lookup Error: unknown encoding charmap](https://stackoverflow.com/questions/47605277/traceback-error-lookup-error-unknown-encoding-charmap),简单来说就是将出错文件中的代码修改一下,不会影响我们自己代码的运行。

2.源代码登录时写的是明文的用户名和密码,这个很不利于我们的账户安全,我在自己的代码中使用了token连接github,更加安全,更方便管理。

代码运行结果如下:

![](https://img2018.cnblogs.com/blog/1506386/201904/1506386-20190419225359632-1290994878.png)

代码链接

第七章代码新建了单独的仓库:https://github.com/ChosenOne95/chapter7/tree/master
第八章:https://github.com/ChosenOne95/black-hat-python3/tree/master/Chapter 8

posted @ 2019-12-09 11:12  三天一个陈平安  阅读(898)  评论(0编辑  收藏  举报