探秘黑客用到的Python技术,领略不一样的“风景胜地”!

对于黑客,大多数的人觉得他们很神秘,很酷,以致于盲目的崇拜。可是却不知道黑客所用的技术是哪些,本期我们一起去看一下他们用的一些Python技术吧!

探秘黑客用到的Python技术,领略不一样的“风景胜地”!

 

Python已经达到了漏洞开发领域的行业标准,你会发现大多数概念验证工具都是用Python编写的(除了用Ruby编写的metasploit框架)。Python允许编写处理远程服务的脚本,摆弄二进制数据并以快速简便的方式与C库(或者在IronPython中使用Jython / .Net的Java)进行交互。带有“包含电池”原理的巨大标准库消除了其他框架/语言中已知的一些依赖性。我想与你分享一些个人的python编码经验,也许这可以为你未来的工作提供一些有用的提示,让世界变得更安全一些

探秘黑客用到的Python技术,领略不一样的“风景胜地”!

 

设置您的环境

对于您将要编写的大多数项目/脚本,将所有依赖项放在一个位置(并且只有特定项目需要的依赖项)非常有用。为了满足这些要求,存在一个名为virtualenv的工具/库 (从版本3.3开始,它已经包含在Python中)。该工具具有为python项目生成隔离环境的简洁功能,而不会使您的全局环境混乱。新环境的产生就像一样简单

$ virtualenv <path to new environment>

或者在Python> = 3.3中:

$ python3 -mvenv <path to new environment>

要使用此环境,您必须激活它:

$ source <path to new environment>/bin/activate

停用/离开环境也很容易:

$ deactivate

安装依赖项

大多数情况下,您会从庞大的python社区中找到一些库,这可以帮助您使用工具获得快速结果。您可以使用您的发行包管理器或使用其中一个可用的pythone包管理器来安装它们。也许最强大的是pip。使用pip,您可以安装依赖项global(# pip install <package>),每个用户($ pip install --user <package>)或虚拟环境((venv) $ pip install <package>)。您可以使用您的发行包管理器手动或使用Python 3.4 onwards($ python3 -mensurepip)提供的库来安装pip 。

当我不是100%确定如何解决当前任务并想要尝试一点时,我通常安装的必备软件包之一是IPython。IPython是一个令人印象深刻的Python shell,用Python编程。举几个功能:

  • 动态对象内省。
  • 通过在提示符下键入TAB,在本地命名空间中完成。
  • 持久命令历史记录。
  • 会话记录。
  • 路径完成。
  • JIT调试器。
  • 自动缩进。

通过pip安装很容易: $ pip install ipython

如果您想创建教程或其他文档文件,ipython(现在由jupyter提供)的笔记本功能允许您通过浏览器与IPython shell进行交互,包括markdown,mathjax和内联matplotlib支持。

(通过安装jupyter(pip install jupyter)使用它们并启动笔记本服务器(jupyter notebook))。

如果您想与HTTP服务(包括JSON / XML-API)进行交互,我建议使用非常棒的请求库。此库处理在与网站交互期间您将面临的大多数编码/解码/参数/ cookie /重定向内容。例如,请求和解析JSON资源是通过以下方式完成的:

r = requests.get('https://api.github.com/user', auth=('user', 'pass'))

r.json()

{u'private_gists': 419, u'total_private_repos': 77, ...}

使用BeautifulSoup库可以在大多数情况下完成HTML解析和交互。该库能够同样处理现有浏览器的HTML输入,包括尝试修复损坏的代码。

与网络交互

您的大部分目标都可以通过网络访问,因此我将简要介绍标准Python安装中已包含的常用/有用Python库。

对于较低的网络级交互,库为您提供套接字和ssl模块。套接字模块是所有常见操作系统上可用的BSD套接字API的薄包装器。因此,如果您已经具有C语言中的套接字编程经验,则可以轻松地将代码转换为Python。存在一些令人信服的功能,例如create_connection创建TCP套接字的功能,解析主机名并连接到给定的主机/端口。另一个包装器是该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))

在连接中添加TLS隧道也非常简单:


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:<[email protected]> ')
print(s.recv(1024))

如果您不需要与服务进行如此低级别的交互,则可以使用多个模块在更高级别进行交互:

  • 的smtplib
  • FTPLIB
  • poplib模块
  • imaplib
  • httplib(Python 3.x中的http.client)
  • nntplib
  • telnetlib(如果您必须利用服务并希望之后进行交互式shell会话,则非常有用)
  • xmlrpclib(Python 3.x中的xmlrpc.client)

二进制处理/编码

在开发必须与服务或文件交互的脚本时,您经常会发现自己需要在不同格式/编码之间转换数据。在Python 2.x中,这大部分时间都像执行一样简单,encode或者decode在字符串上以不同格式转换它:

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

遗憾的是,这个快捷方式在Python 3.x中被删除了,encode而且decode方法现在只能在utf-8,cp1250,iso8859,big5等字符编码之间进行转换。

相反,你现在必须在字节类型上使用两种方法来进行十六进制编码:


bytes.fromhex('414141')
b'AAA'.hex() # starting with Python 3.5

对于Base64编码,您将不得不使用其他模块(在Python 2.x btw中也存在):


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

可以使用urllib.parse模块(或Python 2.x中的urllib)完成编码/解析URL :


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)和二进制可以与结构模块来完成:


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

从Python 3.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'\x10\x00', '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()) # \x39\x05\x00\x00\x41
t2 = Test()
b = io.BytesIO(b'\x10\x00\x00\x00\x42')
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库交互。

探秘黑客用到的Python技术,领略不一样的“风景胜地”!

 

剥削助手

许多CTF团队为开发和CTF解决提供了自己的框架。我发现Gallopsled的pwntools框架非常有用,特别是在利用远程elf二进制文件方面。它包含用于偏移计算的函数(通过循环模式),格式字符串利用(要写入的数据中的简单馈送以及为其生成格式字符串的偏移量),rop链接(使用ropgadget解析elf二进制文件并提供包装器)这导致一个简单的rop链调用)和一个用于不同传输通道(称为管)的整个API。这使您可以开发漏洞,例如使用gdb后端,只需更改一行即可将漏洞利用程序传输到目标服务:


from pwn import *
r = gdb.debug('./level3')
#r = remote(IP, PORT) # simply uncomment to interact with a remote service
r.recvuntil(': ')
r.sendline(EXPLOIT)
r.interactive() # start interactive session

原版英文文章地址:https://insinuator.net/2015/09/python-for-hackers/

以上就是本文的内容,小编也选取了几个例子。喜欢本文的小伙伴或者觉得本文对你有帮助可以点播关注或转发,如果你有好的意见或建议欢迎在下面留言或评论。选取的例子的链接就在后面。

附例:1、https://www.ernw.de/download/python-for-hackers/Pitfalls%202.html

2、https://www.ernw.de/download/python-for-hackers/Pitfalls%203.html

3、https://www.ernw.de/download/python-for-hackers/Network.html

本文来自网络,如有侵权,请联系小编删除!

猜你喜欢

转载自www.cnblogs.com/666fx/p/10123183.html