黑客需要用到的Python技术?

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 黑客需要用到的Python技术?

Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Python语言编写的(除了用Ruby写的安全漏洞检测工具)。Python允许开发者编写脚本处理远程服务,处理二进制文件,与C语言库(或者Java的Jython/。Net的IronPython)以快速且简单的方式进行交互。它“内置电池”原则的巨大标准库,为开发省去对其它框架或者语言的依赖。

我想跟读者们分享个人的Python编程经历,这些也许会对你未来的工作有所帮助,让这个世界变得更加安全一些(注:大多数例子基于Python3.0以上版本编写的,有些可以兼容python所有分支)。

  1. 环境配置

对于你要编写的大多数工程或者脚本,建议读者们最好将所有的依赖放在同一个位置(除了有些在特殊工程中才用到的依赖)。为了满足上述要求,需要用到一个叫virtualenv的工具(Python3.3已经包括该工具),这个工具有一个简洁的功能,就是在不打乱全局环境的基础上,为你的Python工程生成独立的环境:

生成新环境的方法如下:

$ virtualenv <新环境的路径>

或者在Python3.3以上的环境中:

$ python3 -mvenv <新环境的路径>

使用这个环境之前,你要先激活它:

$ source <新环境的路径>/bin/activate

禁止该环境的方式也很简单:

$ deactivate

  1. 安装依赖包

很多时候读者们会发现,借助大型python社区中的python库编写的个人工具,可以帮助我们很快得到结果。你可以通过个人软件管理包或者可用的python软件包管理器安装这些库,其中最权威的就是pip工具了。有了pip,你可以全局安装这些依赖包(#pip install),或者逐用户安装(
黑客们会用到哪些Python技术?

pip install)。读者可以手动地使用个人发行版包管理器,或者基于Python3.4提供的库,安装pip包。

有一个基本的python包叫iPython,通常在我不是100%肯定该如何解决当前任务,想尝试做些实验时,我会安装这个依赖包。IPython是常用的python命令行,它是基于Python编写的,有以下几个特点:

动态对象内省

通过Tab完成本地命名空间

持续的历史记录

会话日志

路径补全

JIT调试器

自动缩进

和平常一样,通过pip安装也很简单:$ pip install ipython

如果你想创建教程或者其它文本文件,ipython中的笔记本特性(现在由jupyter提供)允许用户通过个人浏览器和IPython命令行交互,包括markdown、 mathjax、matplotlib等工具支持。

(通过安装jupyter(pip install jupyter)可以使用它们,开启笔记本服务通过(jupyter notebook))。

如果读者们需要与包括JSON/XML的HTTP服务交互,我建议特别好用的requests依赖库。该python库可以处理与网页交互面对的各类操作,如编码、解码、参数、标记、重定向等。例如,请求和解析一个JSON资源的代码如下:

r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

大多数HTML解析和交互工作都可以交给BeautifulSoup库,该python库可以在任何现在浏览器上处理HTML输入,包括修复受损代码。

  1. 与网络交互

我们大多数目标都有可能在网络上获取,安装好的标准库中已经包含了通用的、有用的python库,这里我对其进行简短的介绍。socket模块是基于BSD socket API的瘦包装器,它在所有的通用操作系统都可用。

所以如果你已经有C语言socket编程经验,你可以将你的代码轻易地翻译成python代码。有很多特别方便的函数,如create_connection函数可以创建TCP socket,建立本机和给定主机或者端口的连接。另一个包装器是sendall方法,有些数据只有当所有给定数据都被发出,或者有错误发生才能在线路中传输,而sendall方法可以尝试重传这些数据。

from future import unicode_literals
import socket
s = socket.create_connection(('www.ernw.de', 80))
s.sendall(b'GET / HTTP/1.1
Host: www.ernw.de
')
print(s.recv(1024))

增加TSL加密链路也非常简单:

from future import unicode_literals
import socket
import ssl
s = socket.create_connection(('www.ernw.de', 443))
s = ssl.wrap_socket(s)
s.sendall(b'GET / HTTP/1.1
Host: www.ernw.de
')
print(s.recv(1024))

上述功能也可以在已经使用的连接中实现:

from future import unicode_literals
import socket
import ssl
s = socket.create_connection(('smtp.example.com', 25))
s.sendall(b'HELO smtp.example.com
STARTTLS
')
print(s.recv(1024))
s = ssl.wrap_socket(s)
s.sendall(b'MAIL FROM:foo@example.com
')
print(s.recv(1024))

如何你不需要这些低级服务交互,还有些模块可以提供高层服务交互:

smtplib

ftplib

poplib

imaplib

httplib (Python 3以上版本的http客户端)

nntplib

telnetlib (应用于服务开发和之后的需要交互命令行会话)

xmlrpclib (Python 3以上版本的xmlrpc客户端)

  1. 二进制操作或编码

当开发与服务或者文件交互的脚本时,你经常会发现需要将数据转换为不同格式或者编码。在Python2.x版本中,通常使用encode或者decode方法将字符串在不同格式之间转换。

"Hello World".encode("hex")
"AAA=".decode("base64")

很可惜,这种捷径在Python3.x版本中被取消了,encode和decode方法当前只可以实现字符编码,如utf-8, cp1250, iso8859, big5等。

作为替代,你现在只能使用bytes类型的两种方法实现十六进制编码:

bytes.fromhex('414141')
b'AAA'.hex() # 从Py3.5 开始

对于Base64编码,你需要使用另外的模块(在Python2.x版本中也有):

import base64
base64.b64encode(b'Hello World')
import codecs
codecs.encode(b'Hello World', 'base64')
import binascii
binascii.b2a_base64(b'Hello World')

URLs编码或者解析可以用urllib.parse模块实现(Python2.x版本中是urllib)

from urllib.parse import quote_plus, unquote_plus
quote_plus('Hello World+1=1337') # Hello+World%2B1%3D1337
unquote_plus('Hello+World') # Hello World

Python普通数据类型(如int,float,str)与二进制之间的一般转换,可以在stuct模块中实现:

import struct
struct.pack('<I', 1337) # convert the integer 1337 into its little endian, 32 bit representation
struct.unpack('<I', b'')[0] # returns tuple of results -> get only the first result
struct.unpack('<I4s', b'Test') # returns (16, b'Test')

Python3.2也可以使用int类型直接获取其二进制表示:

a = 1337
a.to_bytes(4, 'little') # 32 bit little endian
a.to_bytes(2, 'big') # 16 bit big endian
int.from_bytes(b'', 'little') # 16

ctypes 模块还有一个特别棒的特征,如果你将cpython作为解译器(通常大家都是这样),就可以使用ctypes.Structure结构化描述C语言,获取它们的二进制表示,就好像从C应用程序中转储的一样。

from ctypes import *
import io
class TestStructure(Structure):
fields = (('foo', c_int), ('bar', c_char))
t = Test()
t.foo = 1337
t.bar = b'A'
b = io.BytesIO()
b.write(t)
b.seek(0)
print(b.getvalue()) # 9A
t2 = Test()
b = io.BytesIO(b'B')
b.readinto(t2)
print(t2.foo) # 16
print(t2.bar) # B

ctypes 模块通常是Python程序集和C语言库之间的桥梁,不需要编写任何Python包装器。有了ctypes模块,你可以使用任何C语言库和其输出函数:

from ctypes import *
libc = ctypes.CDLL('libc.so.6')
libc.printf(b'Hello World
')

上文中提到Structure 类型主要用于C语言库的交互,在函数调用过程中传递或者获取结构。

  1. 漏洞开发工具

很多CTF团体提供他们自己的的CTF解决方案框架,我发现来自Gallopsled 的pwntools框架特别有用,尤其是开发远程elf二进制时,它包含很多方便的函数,例如位移计算(通过cyclic模式)、格式化字符串开发(普通数据馈送以及产生的格式化字符串)、跳转组合(基于ropgadget解析elf二进制以及提供生成简单跳转组合调用的包装器)和不同传输通道的全部API(称作管道)。这些可以让读者们开发gdb编译后端,同时简单地改变一行代码就可以传输到目标服务。

from pwn import *
r = gdb.debug('./level3')

r = remote(IP, PORT) # 为了做一个远程交互式的接口,先注释

r.recvuntil(': ')
r.sendline(EXPLOIT)
r.interactive() # 开启一个交互式会话

相关文章
|
1月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
186 66
|
1月前
|
SQL 数据采集 数据可视化
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
161 64
|
13天前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
26 2
|
15天前
|
开发框架 开发者 Python
探索Python中的装饰器:技术感悟与实践
【10月更文挑战第31天】 在编程世界中,装饰器是Python中一种强大的工具,它允许我们在不修改函数代码的情况下增强函数的功能。本文将通过浅显易懂的方式,带你了解装饰器的概念、实现原理及其在实际开发中的应用。我们将一起探索如何利用装饰器简化代码、提高可读性和复用性,同时也会分享一些个人的技术感悟,帮助你更好地掌握这项技术。
31 2
|
16天前
|
JSON 安全 数据安全/隐私保护
Python安全守护神:OAuth与JWT,让黑客望而却步的魔法阵🧙‍♂️
在网络世界中,数据安全至关重要。本文介绍了如何在Python环境中使用OAuth 2.0和JSON Web Tokens (JWT) 构建安全的认证系统。OAuth 2.0是一种开放标准授权协议,允许客户端在不暴露用户凭证的情况下访问资源。JWT则是一种轻量级的数据交换格式,用于在各方之间安全地传输信息。结合两者,可以构建出既安全又高效的认证体系。文章通过Flask-OAuthlib和PyJWT库的示例代码,详细展示了实现过程。
33 2
|
19天前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
20天前
|
数据采集 存储 Web App开发
利用Python 的爬虫技术淘宝天猫销量和库存
使用 Python 爬虫技术获取淘宝天猫商品销量和库存的步骤包括:1. 安装 Python 和相关库(如 selenium、pandas),下载浏览器驱动;2. 使用 selenium 登录淘宝或天猫;3. 访问商品页面,分析网页结构,提取销量和库存信息;4. 处理和存储数据。注意网页结构可能变化,需遵守法律法规。
|
21天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
17 1
|
1月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
算法 数据挖掘 Python
Python中的拟合技术:揭示数据背后的模式
Python中的拟合技术:揭示数据背后的模式
40 0
Python中的拟合技术:揭示数据背后的模式