
Research
/Security News
Critical Vulnerability in NestJS Devtools: Localhost RCE via Sandbox Escape
A flawed sandbox in @nestjs/devtools-integration lets attackers run code on your machine via CSRF, leading to full Remote Code Execution (RCE).
:wrench: :pencil: :desktop_computer: Это библиотека для Python, которая выводит информации в несколько консолей. Путем обмена данных через Unix Socket
Установка через pip - console-debugger
pip install console-debugger
Debugger(active: bool, titleName: str, consoleOutput: bool = True, fileConfig: Optional[Dict] = None, styleText: Optional[dstyle] = None
)
Атрибут | Описание |
---|---|
active | on/off жизни экземпляра, Если False экземпляр будет игнорировать вызов, а также будет добавлен в массив Debugger.AllCountSleepInstance . |
titleName | Уникальное имя экземпляра которое будет отображаться в выводе. |
consoleOutput | on/off отображения в консоль или другие визуальные выходы, Не влияет на запись в файл! . |
fileConfig | Конфигурация записи в файл, входные параметры такие же как и у стандартной функции open() передавать в формате {"file":"test.log", ... } . Для удобного формирования параметров можно пользоваться функцией dopen() . |
styleText | Стиль отображения текста. Для удобного формирования параметров можно пользоваться функцией dstyle . |
Также можно использовать готовые параметры
Debugger(**dDEBUG
)
dDEBUG
dINFO
dWARNING
dEXCEPTION
Доступная информации об экземпляре Debugger
public set | Описание |
---|---|
consoleOutput | Переключить on/off вывод в консоль |
styleText | Задать другой стиль текста |
active() | Включить дебагер |
deactivate() | Отключить дебагер |
public get | Описание |
---|---|
titleName | Уникальное имя дебагера |
fileConfig | Конфигурация для файла |
AllCountActiveInstance() | Список со всеми активными экземплярами |
AllCountSleepInstance() | Список со всеми остановленными экземплярами |
AllUseFileName() | Список всех имен используемых файлами |
AllInstance() | Список всех экземпляров |
Эта команда влияет на все экземпляры Debugger
Debugger.GlobalManager(global_status=None, typePrint: Optional[str] = "grid"
):
Атрибут | Описание |
---|---|
global_status | Здесь вы можете Выключить/Включить все экземпляры |
typePrint | Глобальный стиль отображения данных (grid /socket /None ) |
"grid"
= Стиль таблица
"socket"
= Данные будут отправляться по сокету, в данный момент есть два варианта прослушивания сокета.
Через GUI Tkinter console_debugger/main.py gui
или через TUI Urwid
console_debugger/main.py tui
.
Если в процессе отправки данных через сокет возникнут ошибки, данные будут сохранены в файл.None
= Без стиля
Использовать стандартную функцию print
.
print(text, file= Debug_Name
)
text
= СтрокаDebug_Name
= Имя экземпляра Debugger
Использовать функцию printD
. Преимущество в том что может принимать несколько переменных и соеденять их.
printD(Debug_Name, text, *args, sep=' ', end='\n'
)
Debug_Name
= Имя экземпляра Debugger
text
= Строка*args
= Данные преобразуются в тип str
sep=' ', end='\n'
= такие же, как и у встроенной функции print()
Для наглядности создадим функцию для генерации случайного слово
import random
import string
# Сгенерировать случайное слово
random_word = lambda: "".join(random.choice(string.ascii_letters) for j in range(random.randint(1, 40)))
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dopen, dstyle
Debug = Debugger(True,titleName="[DEBUG]",
fileConfig=dopen(file="debug.log",
mode="a",
encoding="utf-8"),
styleText=dstyle(bg_color="bg_blue",
len_word=21)
)
Info = Debugger(True,titleName="[INFO]",
fileConfig={"file": "info.log",
"mode": "a", "encoding": "utf-8"},
styleText=dstyle(len_word=25),
consoleOutput=False
)
Warning = Debugger(True,"[WARNING]", styleText=dstyle(len_word=25))
Debugger.GlobalManager(typePrint="grid")
if __name__ == '__main__':
for i in range(10):
printD(Debug, random_word())
printD(Warning, random_word())
printD(Info, random_word())
printD
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
Debug = Debugger(**dDEBUG)
Info = Debugger(**dINFO)
Warning = Debugger(**dWARNING)
Debugger.GlobalManager(typePrint="grid")
if __name__ == '__main__':
for i in range(10):
printD(Debug, random_word())
printD(Warning, random_word())
printD(Info, random_word())
print
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
Debug = Debugger(**dDEBUG)
Info = Debugger(**dINFO)
Warning = Debugger(**dWARNING)
Debugger.GlobalManager(typePrint="socket")
if __name__ == '__main__':
for i in range(10):
print(random_word(), file=Debug)
print(random_word(), file=Info)
print(random_word(), file=Warning)
soket
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
Debug = Debugger(**dDEBUG)
Info = Debugger(**dINFO)
Warning = Debugger(**dWARNING)
TEST = Debugger(True,"TEST")
Debugger.GlobalManager(typePrint="socket")
for i in range(10):
printD(Debug, random_word())
printD(Info, random_word())
printD(Warning, random_word())
printD(TEST, random_word())
Если вы не запустили сервер, у вас возникнет исключение ServerError: Ошибка сервера
Это специальное исключения для того чтобы вы лично выбрали интерфейс отображения.
Вы можете выполнить команду python /.../.../.local/lib/python3.9/site-packages/console_debugger/main.py tui
в любом терминале Linux, в нем запуститься псевдографический интерфейс.
Или вы можете выполнить команду python /.../.../.local/lib/python3.9/site-packages/console_debugger/main.pyп gui
Тогда у вас запуститься графический интерфейс Tkinter.
[Errno 2] No such file or directory
ServerError: Ошибка сервера
Traceback (most recent call last):
File "/home/denis/Applications/test_imp.py", line 17, in <module>
Debugger.GlobalManager(typePrint="socket")
File "/.../.../.local/lib/python3.9/site-packages/console_debugger/logic/debugger.py", line 190, in GlobalManager
raise ServerError(
helpful.date_obj.ServerError: Вероятно сервер не запущен
********************************************************************************
Выполните команду:
python /.../.../.local/lib/python3.9/site-packages/console_debugger/main.py tui
********************************************************************************
Создать два режима запуска Debug/Release
main.pyw
import sys
from console_debugger import Debugger
from app.viwe import Windows # При импорте должны быть созданы все экземпляры
if __name__ == '__main__':
for param in set(sys.argv):
if param == "--d":
Debugger.GlobalManager(typePrint="grid") # Задать глобальный стиль всем экземпляром
break
else:
Debugger.GlobalManager(global_status=False) # Если нет параметров отключаем все экземпляры
Windows()
В других модулях создаем необходимые экземпляры
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dstyle, dINFO
HotKeyD = Debugger(True, "[HotKey]")
PressKeyD = Debugger(True, "[PressKey]")
InfoD = Debugger(**dINFO)
ResD = Debugger(True, "[Result]", styleText=dstyle(len_word=25, height=4))
printD(HotKeyD,"Crtl+c")
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
if __name__ == '__main__':
a = Debugger(**dDEBUG)
b = Debugger(**dINFO)
c = Debugger(**dEXCEPTION)
Debugger.GlobalManager(typePrint="socket")
TracingName1 = "1"
TracingName2 = ["1"]
TracingName3 = "1",
for x in range(10):
printD(a, TracingName1)
printD(b, TracingName2)
printD(c, TracingName3)
Flask
Поместить Debugger.GlobalManager
в @app.before_first_request
from console_debugger import Debugger, printD
from flask import *
SECRET_KEY = "123_very_hard_password"
app = Flask(__name__)
# Экземпляры в глобальной области видимости
cookDeb = Debugger(True, "[Cook]")
sessionDeb = Debugger(True, "[Session]")
@app.before_first_request
def deb():
# Tkinter будет перезапускаться при каждом обновление сервера
Debugger.GlobalManager(typePrint="socket")
@app.route("/login", methods=['POST', 'GET'])
def login():
global data, cookDeb, sessionDeb
cook = "no"
ses = "no"
# Получить куки если есть
if request.cookies.get("logged"):
cook = request.cookies.get("logged")
# Получить данные из сессии если есть
if "SessioN" in session:
ses = session.get("SessioN")
printD(cookDeb, cook)
printD(sessionDeb, ses)
res = make_response(render_template("login.html", cook=cook, session=ses))
res.set_cookie(key="logged", value="yes", max_age=3)
session["SessioN"] = "yes"
return res
if __name__ == '__main__':
app.run(debug=True)
"login.html"
<script>
document.cookie = "ex=1;";
if (!document.cookie) {
alert("Этот сайт требует включение cookie");
}
</script>
Cook: {{ cook }}
<p></p>
Session: {{ session }}
<form action="/login" method="post" class="form-contact">
<p><label>Name </label><input type="text" name="username" value="" required/>
<p><label>Passwortitled </label><input type="text" name="password" value="" required/>
<p><input type="submit" value="Send"/>
</form>
Django
Добавить в самый конец NameProj/settings.py
import os
from console_debugger import Debugger
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
DEBUG = True
...
...
...
if DEBUG:
Info = Debugger(**dINFO)
Debug = Debugger(**dDEBUG)
Warning = Debugger(**dWARNING)
if not os.environ.get('console_debugger', False): # Для защиты от двойного запуска Django
os.environ['console_debugger'] = "True"
else:
Debugger.GlobalManager(typePrint="socket")
NameApp/views.py
from NameProj.settings import Info,Debug,Warning
from console_debugger import printD
printD(Info,"1")
printD(Info,"2")
printD(Info,"3")
printD
Так как входные параметры функции являются не изменяемыми обметками,
то они копируются в функцию printD
, чтобы н тратить лишении наносекунды
на эту операцию, вы можете закомментировать все вызовы этой функции.
\s{4}printD+
#none: printD
А потом раскомментировать
#none: printD
printD
save geometry
то вы
сохраните положение окна для следующих запусках, размеры сохранять в console_debugger/gui/static/config.txt
Tkinter
, до завершения главного потока, то данные будут отправляться в консоль typePrint=None"
save <NAME_FILE> <PATH>
и нажать Enter
g info
и нажать Enter
clear
и нажать Enter
ArchLinux
sudo pacman -S tk
xrdb -load /dev/null
xrdb -query
Работает также в терминале Pycharm
Этот режим поддерживается в терминалах Linux. Программа находиться в console_debugger/tui/main.py
.
save <NAME_FILE> <PATH>
f1
= Влевоf3
= Верхf2
= Внизf4
= Вправоf5
= МенюTab
= Вправоshif + ЛКМ
= Выделить текстshif + ctrl + C
= Копировать выделенный текстshif + ctrl + V
= Вставить текстclear
и нажать Enter
FAQs
Это подключаемая библиотека, для удобного вывода отладочной информации.
We found that console-debugger demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
A flawed sandbox in @nestjs/devtools-integration lets attackers run code on your machine via CSRF, leading to full Remote Code Execution (RCE).
Product
Customize license detection with Socket’s new license overlays: gain control, reduce noise, and handle edge cases with precision.
Product
Socket now supports Rust and Cargo, offering package search for all users and experimental SBOM generation for enterprise projects.