个人进行python web 项目漏洞复现时,本地搭建环境太复杂,所以通过docker实现远程vscode调试。
网上的教程说的不是很清楚,自己根据实际调试情况梳理一份。
0x0 本机环境:
- mac
- IDE:vscode v1.80.1
- docker desktop v4.12.0
前提:Docker下的web工程正常运行
0x1 .venv虚拟环境
-
快捷键:command+shift+p
-
python create environment
-
选择venv
-
复用的phthon环境尽量用pyenv的
-
会在工程目录下生成
.venv
目录 - 如果安装
requirements.txt
,可以在vscode-终端切换到venv目录下,激活虚拟环境source venv\scripts\activate
,进行pip安装。
0x2 Docker配置
0x21 方法一:vscode自动识别web框架
正常编写Docker文件即可,无需增加调试相关命令
0x22 方法二:通用远程调试
需要额外增加命令
- Dockerfile:
RUN pip install debugpy
- docker-compose.yml:(ports之后)
entrypoint: [ "python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "-m", "flask", "run", "-h", "0.0.0.0"]
,其中5678是vscode远程调试的端口
0x3 vscode调试配置
- vscode 左侧调试栏->点击
新建调试文件
/或c+s+p->Debug: Start Debugging
-
选择
添加配置
-
主要以Django和flask框架为例(未加nodejs等),见0x131和0x132
0x31 方法一:vscode自动识别web框架
-
选择
python
->Docker: Python - Django/flask
-
会在工程目录下生成
.vscode
目录,其中包含两个json文件: -
launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"configurations": [
{
"name": "Docker: Python - Django",
"type": "docker",
"request": "launch",
"preLaunchTask": "docker-run: debug",
"python": {
"pathMappings": [
{
"localRoot": "${workspaceFolder}/web",
"remoteRoot": "/usr/src"
}
],
"projectType": "django"
}
}
]
}
- tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "docker-build",
"label": "docker-build",
"platform": "python",
"dockerBuild": {//自动生成,与docker文件保持一致
"tag": "",
"dockerfile": "${workspaceFolder}/Dockerfile",
"context": "${workspaceFolder}/[..]",
"pull": true
}
},
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn":[
"docker-build"
],
"python": {
"args": [
"runserver",
"0.0.0.0:8000"
],
"file": "web/app.py" //程序主入口,需根据实际情况修改
}
}
]
}
注意:
- 这种情况vscode可能会修改Dockerfile,如果拿不准建议提前备份一下Docker配置
- 搭建github上的工程进行调试时,由于工程文件含requirements.txt,venv pip后实际调试失败,总报错:找不到依赖库
0x32 方法二:通用远程调试
- 选择
python
->Python: 远程附加
->输入调试端口,默认为5678 - 会在工程目录下生成
.vscode
目录,其中包含1个json文件: - lanch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: 远程附加",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678 //远程调试端口
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
],
"justMyCode": true
}
]
}
- docker-compose.yml的ports添加一行:
- "5678:5678"
0x4 vscode调试
-
在待调试文件代码处下断点
-
运行docker:docker-compose.yml右键->Compose Up(第一次)或Compose Restart->等待docker正常启动
-
开始调试:
-
方法一:运行和调试->自动有
Python: Remote Attach
按钮,点击 -
方法二:无
Python: Remote Attach
时,让待调试文件处于活跃状态(即当前看见的代码是调试代码)->运行和调试->齿轮右侧省略号->开始调试