利用python连接并控制SSH

使用pexpect来连接ssh

(该工具只能在linux下使用)

python连接ssh并且执行命令,显示输出结果

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
#!/usr/bin/python
import pexpect
PROMPT = ['# ','>>> ','> ','\$ ']
def send_command(child,cmd):
child.sendline(cmd)
child.expect(PROMPT)
print child.before

def connect(user,host,password):
ssh_newkey = 'Are you sure you want to continue connecting (yes/no)?'
connStr = 'ssh ' + user + '@' + host
child = pexpect.spawn(connStr)
ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])
if ret == 0:
print '[-] Error Connecting'
return
if ret ==1:
print "send yes to server!\n"
child.sendline('yes')
ret = child.expect([pexpect.TIMEOUT,'[P|p]assword: '])
if ret == 0:
print '[-] Error Connecting'
return
child.sendline(password)
child.expect(PROMPT)
return child
ss = connect("root","heiyiren.top","heiyiren312429020!@#")
send_command(ss,'cat /etc/shadow | grep root')

CloudStack安装部署

整整折腾了一个星期,终于将CloudStack的安装部署搞定了

整个流程下来遇到很多问题,也学到很多东西,果然遇到问题还是不要逃避才能学到知识。

对其进行二次开发做虚拟化的想法萌生出来,感觉这种方式来尽心信息安全实验开发环境开发是一件很有意义的事情。

有时间重新部署一遍,然后把过程记录下来,二次开发的话暂时不考虑,得等软件逆向这块知识啃下来之后再考虑,学校的事情也比较多,毕业设计也还没做!!!

python之端口扫描

使用python脚本进行tcp全连接测试

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
from socket import *
from threading import Thread
import optparse

def connPort(ipAddr,port):
setdefaulttimeout(1)
try:
conn = socket(AF_INET,SOCK_STREAM)
conn.connect((ipAddr,port))
conn.send(b"python\r\n")
print("[+] %d/tcp open"%port)
results = conn.recv(100)

print("[+] %s"%str(results,encoding="utf-8"))
except Exception as e:
#print(e)
pass

if __name__ == "__main__":
parser = optparse.OptionParser("python portscan.py -H <host ip addr> -p <port>")
parser.add_option("-H",dest='hAddr',type='string',help='specify ip addr')
parser.add_option("-p",dest='port',type='string',help='specify port')
(options,args) = parser.parse_args()
if options.hAddr==None or options.port==None:
print(parser.usage)
else:
ports = str(options.port).split(",")
for i in ports:
t = Thread(target=connPort,args=(options.hAddr,int(i)))
t.start()

python破解zip密码

今天写了个小脚本,用于暴力破解zip密码

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
import zipfile
from threading import Thread
import optparse

def testZipPasswd(zfile,passWord):
try:
zfile.extractall(pwd=passWord)
print("[+] Found Password: "+str(passWord,encoding="utf-8"))
except Exception as e:
#print(e)
pass
def decodeZipPasswd(zfile,passfile):
with open(passfile) as f:
zfile = zipfile.ZipFile(zfile)
for i in f.readlines():
i = i.replace("\n","")
t = Thread(target=testZipPasswd,args=(zfile, i.encode(encoding="utf-8")))
t.start()
if __name__ == "__main__":
parser = optparse.OptionParser("python zip.py -f <zipfile> -p <passfile>")
parser.add_option("-f",dest='zname',type='string',help='specify zip file')
parser.add_option("-p",dest='passwd',type='string',help='specify password file')
(options,args) = parser.parse_args()
if options.zname ==None or options.passwd==None:
print(parser.usage)
exit(0)
else:
decodeZipPasswd(options.zname,options.passwd)

达克效应

今天不想做任何事情,下班后就开始逛网站。

自己的自信心受到了一些打击,觉得自己好菜,什么都不会,然后反省一下,入门渗透的这段时间自己膨胀的厉害。

百度上看着看着,发现一个达克效应,具体描述如下图所示:

感觉自己差不多算是在愚昧山峰了,啥时候能走下来,走到绝望之谷之后才会有更多的进步吧,忙完这段时间要开始学习逆向和代码审计了,其实还有好多想做的事情没去做,比如 MSF渗透工具的使用,各种kali攻击技巧的学习,都没时间去做,甚至想针对PHP进行深入学习,亦或是加强自己C++编程能力,学习编译原理等等。

总结一下,就是前段时间有点膨胀了,觉得自己入门了渗透,有点迷之自信,现在想想自己果然还是菜鸡,在每个方面都只是知道了点皮毛,但却有点那种我好像知道这个东西是做什么,以后可以慢慢学,学了就可以会的那种心态。

在这里给自己立一个flag,今年要学完基础的linux软件调试和 Android的软件调试,要进行一次简单CMS框架的代码审计,要学会使用MSF渗透工具和Kali常用渗透工具的基本用法,还要保证自己每周最少健身一次,每周最少有1天的学习时间。

希望自己接下来的每一周都能做一些笔记,每天拿出1个小时的时间逛freebuf等技术论坛。

密码学咱现在先不去动他。。。编译原理。。。编程。。。也都丢一边去。。先从脚本小子开始吧。

Linux密码加密方式之salt

今天学了关于Linux密码加密的方式,以及如何通过密文来暴力破解明文(需要强大的字典或者算力)

密码发展

密码从最开始的明文 -> 单向哈希加密 -> 带有盐的单向加密方式

最开始数据库中的数据

username password
admin 123

到后来的单向哈希加密

username password
admin 202cb962ac59075b964b07152d234b70

再到后来的带有盐的单向加密

username salf password
admin salf b3d513356bdf68b968b2eb69148cecdd

python获取网卡信息

Python获取本机IP地址的一般方法为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import socket

IP = socket.gethostbyname(socket.gethostname())
  通过gethostname获取主机名,再用gethostbyname将主机名转换为IP地址。

  那么,问题来了。如果主机有多个网卡/IP,怎样获取某个指定的IP地址呢?

  一个方法是通过socket.gethostbyname_ex获取主机IP地址列表,然后遍历列表取得自己需要的IP。

import socket

#多网卡情况下,根据前缀获取IP(Windows 下适用)
def GetLocalIPByPrefix(prefix):
localIP = ''
for ip in socket.gethostbyname_ex(socket.gethostname())[2]:
if ip.startswith(prefix):
localIP = ip

return localIP


print(GetLocalIPByPrefix('192.168'))

更简单的方法(不用修改代码,还是用socket.gethostname函数),是通过配置hosts文件改变IP优先级。

上面的方法只支持IPv4,如果要获取IPv6信息,参考socket.getaddrinfo。
Updated 2018-03-08

1、用系统库获取单机 mac 地址。

import uuid

针对单网卡

1
2
3
4
def GetMAC():
addr = hex(uuid.getnode())[2:].upper()

return '-'.join(addr[i:i+2] for i in range(0, len(addr), 2))

2、用第三方库 psutil 打印网络适配器信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import psutil

# 打印多网卡 mac 和 ip 信息
def PrintNetIfAddr():
dic = psutil.net_if_addrs()
for adapter in dic:
snicList = dic[adapter]
mac = '无 mac 地址'
ipv4 = '无 ipv4 地址'
ipv6 = '无 ipv6 地址'
for snic in snicList:
if snic.family.name in {'AF_LINK', 'AF_PACKET'}:
mac = snic.address
elif snic.family.name == 'AF_INET':
ipv4 = snic.address
elif snic.family.name == 'AF_INET6':
ipv6 = snic.address
print('%s, %s, %s, %s' % (adapter, mac, ipv4, ipv6))

跨平台的根据前缀获取 ip 的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import psutil

# 多网卡情况下,根据前缀获取IP
# 测试可用:Windows、Linux,Python 3.6.x,psutil 5.4.x
# ipv4/ipv6 地址均适用
# 注意如果有多个相同前缀的 ip,只随机返回一个
def GetLocalIPByPrefix(prefix):
localIP = ''
dic = psutil.net_if_addrs()
for adapter in dic:
snicList = dic[adapter]
for snic in snicList:
if not snic.family.name.startswith('AF_INET'):
continue
ip = snic.address
if ip.startswith(prefix):
localIP = ip

return localIP


print(GetLocalIPByPrefix('192.168'))

QT weight开发

1.新建项目

新建项目时选择QT Dialog

2.更换icon

修改.pro文件

将ico文件放到项目目录。

添加 RC_ICONS = myico.ico

3.模态对话框

模态使用 exec 非模态使用 show

4.添加按钮点击事件

添加信号槽即可进行按钮点击事件的编写

5.print函数无法输出

使用 fflush(stdout); 刷新一下数据

搭建CTFD平台

安装Flask

1
pip install Flask

下载安装CTFD

1
2
3
4
git clone https://github.com/isislab/CTFd.git
cd CTFd
./prepare.sh #需手动排查各种依赖包
python serve.py

优化CTFD

1
2
pip install gunicorn
gunicorn --bind 0.0.0.0:8000 -w 4 "CTFd:create_app()"

Docker的基本使用

Docker常用命令

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
docker ps   #  docker进程管理系统

-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。

docker run

-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
-m :设置容器使用内存最大值;

docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器

docker kill : 强行关闭一个容器

docker rm :删除一个或多少容器

docker rmi :删除一个或多少镜像

docker images :查看所有镜像


docker save lnmp -o lnmp.tar
docker load -i lnmpp.tar

以上方法用于保存整个docekr

docker export [OPTIONS] CONTAINER # -o :将输入内容写到文件。
docker import my_ubuntu_v3.tar runoob/ubuntu:v4


docker build -t runoob/ubuntu:v1 .