Пишемо найпростіший сканер портів
Досить часто можна зустріти таку реальну ситуацію, що знадобилася статистика з безпеки тачки. З подібним зіткнувся і я, а якщо конкретніше, то мене цікавили відкриті порти telnet'а (за стандартом це 23-й порт, кому потрібні подробиці - див. RFC 1060). Ну не станеш же ти, перець, використовувати статистику з газет 🙂 - хіба мало звідки її брали. Так що я перейшов до більш рішучих заходів.
Під рукою був сервер, який працював цілодобово, з встановленим і сконфігурованим Linux'ом. Звичайно, можна було використовувати готові сканери - благо в мережі їх навалом. Однак куди цікавіше і корисніше з точки зору придбаних практичних навичок написати хоч і простенький сканер, але все ж самому.
Вибір мов програмування був цілком достатній, але пам'ятаючи, що простота - запорука успіху, я вибрав для написання зв'язку Perl + Expect. Трохи обгрунтую для непосвячених: Perl - найпотужніша штука при обробці тексту та при цьому вельми зручна, а Expect - вже готовий продукт для автоматизації різних завдань із заздалегідь відомими вхідними / вихідними даними. Думаю, вже зрозуміліше :).
Щоб хоч трохи розібратися з використовуваними мовами, зробимо наступне: для Expect існує така утилитка, як autoexpect. З її допомогою можна легко наваять простенький скрипт, на основі якого можна зрозуміти основні принципи, закладені в Expect. Припустимо, ми хочемо домогтися, щоб скрипт «скачав» з ftp-сервера який-небудь файл. Для цього виконуємо команду: autoexpect ftp ftp.our_ftp_server.com.
Далі ми просто Конект до сервера, викачуємо потрібний файл і закриваємо сеанс. Сподіваюся, працювати з ftp-клієнтом все вже вміють :). В результаті отримуємо готовий скрипт, за замовчуванням створюється файл script.exp, але можна і відразу ставити ім'я файлу - autoexpect -f my_script_name ftp ftp.our_ftp_server.com, який робить те, що ми до цього робили вручну. Зрозуміло, в autoexpect є купа інших корисних фішок, але їх ви вже будете вивчати самостійно. Для більш докладної інформації раджу заглянути в мануал - man autoexpect.
- set - встановити значення змінної;
- expect - чекати заздалегідь відоме значення (цілком можна задати маскою);
- send - відправити значення;
- spawn - породити процес;
- close - завершити процес;
- exit - завершити роботу скрипта.
Отже, озброївшись моїми порадами і власними мізками можете спробувати написати свій власний скрипт. Наприклад, можна спробувати приєднатися до своєї власній машині за допомогою ТЕЛНЕТ і відправити повідомлення самому собі, по милу, зрозуміло :). Далеко не всякий відразу ж кинеться писати свій скрипт - на цей випадок наводжу вже готовий варіант написаного скрипта:
Перевірте - все повинно працювати. Тепер злегка ускладнити скриптик і будемо вести log-файл. Тут вже я допомагати не буду - пишіть самі;). Для цього юзаем log_file - інше дивіться в man pages :). Після перших вдалих дослідів можна приступати власне до написання самого сканера. Тут виникають деякі підводні камені: ну, в першу чергу варто звернути увагу на команду spawn - породження нового процесу. Що ж тут може такого бути?
Висновок - необхідно, щоб скрипт при запуску сам продовжував сканування з моменту обриву зв'язку. Все це я реалізував ще в 2-х скриптах - ось тут-то і знадобився Perl. А щоб це все працювало, само собою я використовував cron (хто не в курсі - см. Man cron). Однак я думаю, що вам буде набагато корисніше написати все скрипти самим;). До того ж їх можна реалізувати і набагато простіше. І я ні в якому разі нікого не закликаю сканувати чужі мережі за допомогою даного скрипта - все може закінчитися досить плачевно :).
Покажи цю статтю друзям: