2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Можно ли скачивать файлы с помощью сокетов Nmap?
Сообщение17.06.2020, 03:55 
Пытаюсь (для опыта) скачать фотографию по ftp с помощью nmap (библиотека nse ftp). Пишу маленький скрипт на lua, создаю сокет, посылаю запрос "скачать", скачивает кусочек размером 1.42 кб, никаких ошибок не выдаёт. Для гарантии скачиваю ту же фотографию браузером и смотрю (с помощью Wireshark), какие ftp-запросы посылает браузер. Посылаю сам те же запросы, всё идёт хорошо до скачивания, но не скачивает.

 
 
 
 Re: Можно ли скачивать файлы с помощью сокетов Nmap?
Сообщение17.06.2020, 11:28 
Покажите, пожалуйста, код. По симптомам можно только предположить, что программа преждевременно выходит из цикла скачивания. Вы вдохновляетесь существующими скриптами или пишете с нуля?

 
 
 
 Re: Можно ли скачивать файлы с помощью сокетов Nmap?
Сообщение17.06.2020, 13:22 
Код:
local socket, code, message, buffer = ftp.connect(host, port, {request_timeout=8000})
local status, code, message = ftp.auth(socket, buffer, "anonymous", "IEUser@")
local list_socket, err = ftp.pasv(socket, buffer)
local status, err = socket:send("TYPE I\r\n")
local status, err = socket:send("RETR /sda1/New folder/20190315_183030.jpg\r\n")
local status, data = list_socket:receive()

Вдохновляюсь существующими скриптами, но там не нахожу примера. Wireshark показывает следующее
https://ibb.co/KjRfq7y
Всё правильно до предпоследней команды включительно.

 
 
 
 Re: Можно ли скачивать файлы с помощью сокетов Nmap?
Сообщение17.06.2020, 13:52 
Не вижу, чтобы это было явно отмечено в документации, но, скорее всего, list_socket:receive() нужно вызывать в цикле и складывать возвращаемые значения в таблицу, пока оно не вернёт пустую строку, как это сделано в функции list в примере выше. Возможно, можно считать размер файла (который передаёт FTP-сервер), а затем при помощи методов receive_bytes или receive_buf загрузить его целиком за один вызов, но я не вижу никакой документации, которая описывала бы эти методы.

Это происходит потому, что на низком уровне операционную систему можно попросить считать $\le n$ байт из соединения в предоставленный приложением буфер заданного размера $n$, и та имеет право вернуть приложению управление, считав меньше, чем $n$. (Функция list_socket:receive() вызывает nsock_read(), который, судя по комментарию, возвращает управление после чтения более-менее произвольного количества байт.)

 
 
 
 Re: Можно ли скачивать файлы с помощью сокетов Nmap?
Сообщение17.06.2020, 14:43 
Получилось, спасибо! Запустил в цикле команду
Код:
local status, data = list_socket:receive_bytes(10)

 
 
 
 Re: Можно ли скачивать файлы с помощью сокетов Nmap?
Сообщение01.08.2020, 21:08 
И теперь пытаюсь делать это в цикле (скачивать все файлы со страницы). В результате скачивается только первый файл, а все последующие не скачиваются (получаются файлы размера 0), потому что команда
Код:
status, data = list_socket:receive()

выдаёт статус false и дата EOF. Может, его (сокет) надо как-то чистить после скачивания файла?
P.S. Если в цикле создавать новый сокет для каждого файла, то всё скачивается. Но это как-то избыточно.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group