{"id":377063,"date":"2024-05-26T09:26:03","date_gmt":"2024-05-26T09:26:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=377063"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=377063","title":{"rendered":"<span>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 OSINT \u0438 \u043f\u0435\u043d\u0442\u0435\u0441\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0430 Python<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h1 id=\"kobra-sozdaem-osint-instrument-na-python-chast-1\">\u041a\u043e\u0431\u0440\u0430: \u0441\u043e\u0437\u0434\u0430\u0435\u043c OSINT \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0430 Python, \u0447\u0430\u0441\u0442\u044c 1<\/h1>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0436\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 OSINT-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 Python.<\/p>\n<p>  <\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0446\u0435\u043b\u044f\u0445 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f, \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0431\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 IP \u0430\u0434\u0440\u0435\u0441\u0435<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043d\u043e\u043c\u0435\u0440\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0435\u0441\u0442\u044c \u043b\u0438 IP \u0432 \u0447\u0435\u0440\u043d\u044b\u0445 \u043b\u0438\u0441\u0442\u0430\u0445 DNS<\/li>\n<li>\u041f\u0430\u0440\u0441\u0435\u0440 \u0432\u0441\u0435\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u0441\u0430\u0439\u0442\u0430<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432<\/li>\n<li>SYN-\u0441\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 \u0441\u0435\u0441\u0441\u0438\u0439 Meterpreter \u0434\u043b\u044f Windows 7\/10<\/li>\n<li>Virus Total API<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 SQL \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 XSS \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/li>\n<li>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0444\u0435\u0439\u043a\u043e\u0432\u043e\u0433\u043e User-Agent<\/li>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f mac-\u0430\u0434\u0440\u0435\u0441\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 <strong>\u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/strong>, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u0434, \u0443\u043b\u0443\u0447\u0448\u0438\u043c \u0435\u0433\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 CLI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u043d\u043e\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0431\u0443\u0434\u0443 <a href=\"https:\/\/t.me\/+oASXM_Y_EgphNTky\" rel=\"nofollow noopener noreferrer\">\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0435.<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c python-\u043a\u043e\u0434.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 Python >3.9, Linux \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 pip.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e <a href=\"https:\/\/github.com\/AlexeevDeveloper\/cobra\" rel=\"nofollow noopener noreferrer\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a, \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/docs\/ru<\/code> \u0435\u0441\u0442\u044c markdown-\u0432\u0435\u0440\u0441\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<h1 id=\"sozdaem-rabochee-okruzhenie\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0441\u0430\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u0434\u0430\u0431\u044b \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438) \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c <em>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/em>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">python3 -m venv &lt;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f> # \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f venv python3 -m venv venv<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443 \u0432\u0430\u0441 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u2014 \u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435 \u2014 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">source venv\/bin\/activate # \u0418\u043b\u0438, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 fish: source venv\/bin\/activate.fish<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b. \u0414\u043b\u044f \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>deactivate<\/code>.<\/p>\n<p>  <\/p>\n<h1 id=\"ustanovka-zavisimostey\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h1>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 <code>whois<\/code>. \u041e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 IP \u0430\u0434\u0440\u0435\u0441\u0430\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">sudo pacman -S whois            # Arch sudo apt install whois          # Debian\/Ubuntu sudo dnf install whois          # Fedora sudo epm install whois          # Alt<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c python-\u043f\u0430\u043a\u0435\u0442\u044b. \u0421\u043f\u0438\u0441\u043e\u043a \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e <a href=\"https:\/\/github.com\/AlexeevDeveloper\/cobra\" rel=\"nofollow noopener noreferrer\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a> \u0432 \u0444\u0430\u0439\u043b\u0435 requirements.txt. \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">pip3 install -r requirements.txt<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0438\u043c \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443!<\/p>\n<p>  <\/p>\n<h1 id=\"arhitektura-proekta\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h1>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>core<\/code> \u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430<\/li>\n<li>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>modules<\/code> \u2014 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b.<br \/> \n<ul>\n<li><code>anonymity<\/code> \u2014 \u043c\u043e\u0434\u0443\u043b\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0441\u0442\u0438, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u0415\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u0434\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0435\u0439\u043a\u043e\u0432\u043e\u0433\u043e \u044e\u0437\u0435\u0440-\u0430\u0433\u0435\u043d\u0442\u0430 (<code>fakeuseragent.py<\/code>) \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>machanger.py<\/code>)<\/li>\n<li><code>network_base<\/code> \u2014 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0442\u0438, IP \u0438 \u043f\u043e\u0440\u0442\u0430\u0445. \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b: \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u0433\u0435\u043e-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0434\u043e\u043c\u0435\u043d \u0438\u0437 IP, IP \u0438\u0437 \u0434\u043e\u043c\u0435\u043d\u0430, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 IPv4, \u0432\u0430\u0448 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 IP, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0442\u0438, \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043f\u0438\u043d\u0433\u0430 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 \u0438 \u0442.\u0434.<\/li>\n<li><code>osint<\/code> \u2014 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u0430\u043a \u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0434\u043b\u044f OSINT \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u043a\u0441\u0438-\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c network_base, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 ip \u0438 \u043d\u043e\u043c\u0435\u0440\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.<\/li>\n<li><code>scanners<\/code> \u2014 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440 IP \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0447\u0435\u0440\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445 DNS, \u043f\u0430\u0440\u0441\u0435\u0440 \u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u0441\u0430\u0439\u0442\u0430, \u0441\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432, \u043f\u043e\u0438\u0441\u043a SQL-Injection \u0438 XSS \u0443\u044f\u0438\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439<a href=\"https:\/\/uproger.com\/sozdaem-s-nulya-osint-i-pentest-instrumenty-na-python\/\" rel=\"nofollow noopener noreferrer\">.<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\u0424\u0430\u0439\u043b <code>main.py<\/code> \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u0434\u0430 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f core \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0442\u0440\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e<\/p>\n<p>  <\/p>\n<ul>\n<li><code>highlight_schemes.py<\/code> \u2014 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b Pygments.<\/li>\n<li><code>logger.py<\/code> \u2014 \u0444\u0430\u0439\u043b \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u043b\u043e\u0433\u0433\u0435\u0440\u0430, \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/li>\n<li><code>style.py<\/code> \u2014 \u0444\u0430\u0439\u043b \u0441 \u0446\u0432\u0435\u0442\u0430\u043c\u0438, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u0430\u044f \u0442\u0435\u043c\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 CLI-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430 Python. \u0410 \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 modules \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432, \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0437\u0434\u0435\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c.<\/p>\n<p>  <\/p>\n<h1 id=\"sozdanie-moduley\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/h1>\n<p>  <\/p>\n<p>\u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0441\u0442\u0438<\/p>\n<p>  <\/p>\n<h1 id=\"generaciya-feykovogo-user-agent\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0435\u0439\u043a\u043e\u0432\u043e\u0433\u043e User-Agent<\/h1>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>fake-useragent<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">from fake_useragent import UserAgent  def generate_useragent() -> str:     fua = UserAgent()      return str(fua.random) <\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u044e\u0437\u0435\u0440-\u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p>  <\/p>\n<h1 id=\"izmenenie-mac-adresa\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 MAC-\u0430\u0434\u0440\u0435\u0441\u0430<\/h1>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041d\u043e \u0432\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 <code>net-tools<\/code>. \u042d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 ifconfig, \u0430\u043d\u0430\u043b\u043e\u0433 ipconfig \u0432 Windows, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import re import subprocess from random import choice  def ifconfig():     \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ifconfig\"\"\"     output = subprocess.check_output([\"sudo\", 'ifconfig'])      return str(str(output.decode('utf-8')).replace(r'\\n', '\\n'))  def change_mac(interface: str, new_mac_address: str) -> None:     \"\"\"\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b ifconfig      \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:      + interface: str - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (ex. wlan0, wlp1s0, wlp3s0, eth)      + new_mac_address - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e mac-\u0430\u0434\u0440\u0435\u0441\u0430\"\"\"     print(f'[+] \u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 {interface}')     subprocess.call([\"doas\", \"ifconfig\", interface, \"down\"])     print(f'[+] \u0417\u0430\u043c\u0435\u043d\u0430 MAC-\u0430\u0434\u0440\u0435\u0441\u0430 {interface} \u043d\u0430 {new_mac_address}')     subprocess.call([\"doas\", 'ifconfig', interface, 'hw', 'ether', new_mac_address])     print(f'[+] \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 {interface}')     subprocess.call([\"doas\", \"ifconfig\", interface, \"up\"])  def get_random_mac_address() -> str:     \"\"\"\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e mac-\u0430\u0434\u0440\u0435\u0441\u0430.     \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u043e\u0442 0 \u0434\u043e 9, \u0438 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u043a\u0432 \u043e\u0442 a \u0434\u043e f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0447\u0430\u043b\u043e     \u043d\u043e\u0432\u043e\u0433\u043e mac-\u0430\u0434\u0440\u0435\u0441\u0430 (00). \u041f\u043e\u0441\u043b\u0435 \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c 5 \u0440\u0430\u0437 \u0435\u0449\u0435      \u043f\u043e \u043f\u0430\u0440\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c      \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:      + str - \u043d\u043e\u0432\u044b\u0439 mac-\u0430\u0434\u0440\u0435\u0441\"\"\"     characters = list(\"1234567890abcdef\")     random_mac_address = \"00\"      for i in range(5):         random_mac_address += ':' + choice(characters) + choice(characters)      return random_mac_address  def get_current_mac(interface: str):     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 MAC-\u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b ifconfig\"\"\"     output = subprocess.check_output([\"doas\", \"ifconfig\", interface])      return re.search(r\"\\w\\w:\\w\\w:\\w\\w:\\w\\w:\\w\\w:\\w\\w\", str(output)).group(0)  def main(interface: str):     new_mac_address = get_random_mac_address()      try:         current_mac = get_current_mac(interface)     except subprocess.CalledProcessError as ex:         print(f'[!] \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e {interface} \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442')         print(f' !-> {ex}')         return      print(f'[+] \u0422\u0435\u043a\u0443\u0449\u0438\u0439 MAC-\u0430\u0434\u0440\u0435\u0441: {current_mac}')     print(f'[+] \u0417\u0430\u043c\u0435\u043d\u0430 MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430 {new_mac_address}')     change_mac(interface, new_mac_address) <\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"modul-network_base\">\u041c\u043e\u0434\u0443\u043b\u044c <code>network_base<\/code><\/h1>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u044c\u044e. \u041d\u043e \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e <a href=\"https:\/\/github.com\/AlexeevDeveloper\/cobra\/tree\/main\/modules\/network_base\" rel=\"nofollow noopener noreferrer\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0438\u0431\u043e \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 IP. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e, \u043e\u043d \u043e\u0431\u0438\u043b\u044c\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043c \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u2014 \u0432\u0441\u0435 \u043e\u043d\u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<h1 id=\"modul-osint\">\u041c\u043e\u0434\u0443\u043b\u044c OSINT<\/h1>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c. \u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c <code>ip.py<\/code> \u2014 \u043e\u043d \u043f\u043e\u0432\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 IP \u0430\u0434\u0440\u0435\u0441\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import os import requests  def get_info_about_ip(ipaddr: str, fua: str) -> tuple:     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 IP \u0430\u0434\u0440\u0435\u0441\u0435      \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:      + ipaddr: str - IP \u0430\u0434\u0440\u0435\u0441      + fua: str - \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u044e\u0437\u0435\u0440-\u0430\u0433\u0435\u043d\u0442\"\"\"     result = str()      try:         # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441         headers = {             'User-Agent': fua         }         info_data = requests.get(f'https:\/\/ipinfo.io\/{ipaddr}\/json', headers=headers).json()     except Exception as ex:         # \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0430\u043c\u0443 \u043e\u0448\u0438\u0431\u043a\u0443.         return ex      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 IP     whois_info = os.popen(f'whois {ipaddr}').read().strip()      result += f'IP: {info_data.get(\"ip\")}\\n'     result += f'City: {info_data.get(\"city\")}\\n'     result += f'Region: {info_data.get(\"region\")}\\n'     result += f'Country: {info_data.get(\"country\")}\\n'     result += f'Hostname: {info_data.get(\"hostname\")}\\n'     result += f'JSON data: {info_data}\\n'     result += f'WhoIS: {whois_info}\\n'      # \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442     return result<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>netlib.py<\/code>. \u041e\u043d \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043a\u0438\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u0435\u043c OSINT \u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u043c network_base.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import modules.network_base.ipv4_local_cli as ipv4_cli import modules.network_base.ipv4_local_getmac as ipv4_gm import modules.network_base.ipv4_local_sock as ipv4_sock  import modules.network_base.router_ip as getaway  import modules.network_base.network_params as net_param  import modules.network_base.ip_from_domain as ip_domain import modules.network_base.domain_from_ip as domain_ip import modules.network_base.service_on_port as serv_port  import modules.network_base.my_public_ip as public_ip import modules.network_base.ping_address as ping_addr import modules.network_base.geolocation_ip as geo_ip import modules.network_base.addr_from_geo as addr_geo  def url_info(url):     \"\"\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 URL.      URL \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 IP\"\"\"      # \u041f\u0438\u043d\u0433 \u0430\u0434\u0440\u0435\u0441\u0430     print(f'Ping domain of address: {ping_addr.ping_addr(ip_domain.ip_from_domain(f\"{url}\"))}')     # \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b     print(f\"Coords by IP address: {geo_ip.geo_ip(domain_ip.domain_ip(ip_domain.ip_from_domain(f'{url}')))}\")     # \u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c     print(f\"Physical address by coords: \"         f\"{addr_geo.get_addr(geo_ip.geo_ip(domain_ip.domain_ip(ip_domain.ip_from_domain(f'{url}'))))}\")     # IP \u0438\u0437 \u0434\u043e\u043c\u0435\u043d\u0430     print(f\"IP-address of domain {url}: {ip_domain.ip_from_domain(f'{url}')}\")     # \u0414\u043e\u043c\u0435\u043d \u0438\u0437 IP     print(f\"Domain name {url} by IP: {domain_ip.domain_ip(ip_domain.ip_from_domain(f'{url}'))}\")  def ip_info(ip: str) -> str:     \"\"\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 IP\"\"\"     print(f'Ping domain or address: {ping_addr.ping_addr(ip)}')     print(f\"Coords by IP: {geo_ip.geo_ip(ip)}\")     print(f\"Geo Addr Coords by IP: {addr_geo.get_addr(geo_ip.geo_ip(domain_ip.domain_ip(ip)))}\")     print(f\"Domain name: {domain_ip.domain_ip(ip)}\")  def check_network():     \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\"\"\"      # \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 IP     print(f'Local IP (cli): {ipv4_cli.local_ipv4()}')     print(f'Local IP (gm): {ipv4_gm.local_ipv4()}')     print(f'Local IP (sock): {ipv4_sock.local_ipv4()}')      # IP \u0448\u043b\u044e\u0437\u0430     print(f'IP router: {getaway.router_ip()}')      # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0442\u0438     print(f'Network interface parameters:\\n{net_param.network_param()}')      # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043d\u0430 80 \u043f\u043e\u0440\u0442\u0443     print(f'Name of service work on port 80: {serv_port.type_port(80)}')      # \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 IP     print(f'Public IP: {public_ip.public_ip()}')<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u2014 <code>phone.py<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043d\u043e\u043c\u0435\u0440\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import requests  def get_info_phonenumber(phonenumber, fua):     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u043e\u043c\u0435\u0440\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430      \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:      + phonenumber - \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430      + fua - \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u044e\u0437\u0435\u0440-\u0430\u0433\u0435\u043d\u0442\"\"\"     result = ''     try:         # \u0414\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API         url = f\"https:\/\/htmlweb.ru\/geo\/api.php?json&amp;telcod={phonenumber}\"         headers = {             'User-Agent': fua         }         info_data = requests.get(url, headers=headers).json()     except Exception as ex:         return ex      result += f'Country: {info_data[\"country\"][\"name\"]}\\n'     result += f'Region: {info_data[\"region\"][\"name\"]}\\n'     result += f'Subregion: {info_data[\"region\"][\"okrug\"]}\\n'     result += f'Operator: {info_data[\"0\"][\"oper\"]}\\n'     result += f'Location: {info_data[\"country\"][\"location\"]}\\n'      return result<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u2014 <code>whois_information.py<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">#!venv\/bin\/python3 import socket import time from ipaddress import IPv4Address, AddressValueError from datetime import datetime import ipwhois import whois  def ipwhois_info(ip: str):     \"\"\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e IP \u043f\u043e IPWhois       + ip: str - IP \u0430\u0434\u0440\u0435\u0441\"\"\"     results = ipwhois.IPWhois(ip).lookup_whois()     print(results)     print(\"\\n\")  def whois_info(ip):     \"\"\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e IP \u043f\u043e WhoIs       + ip: str - IP \u0430\u0434\u0440\u0435\u0441\"\"\"     results = whois.whois(ip)     print(results)  def ianna(ip):     \"\"\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e IP \u0447\u0435\u0440\u0435\u0437 whois.iana.org       + ip: str - IP \u0430\u0434\u0440\u0435\u0441\"\"\"     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     s.connect((\"whois.iana.org\", 43))     s.send((ip + \"\\r\\n\").encode())     response = b\"\"      while True:         data = s.recv(4096)         response += data         if not data:             break      s.close()     whois = ''      for resp in response.decode().splitlines():         if resp.startswith('%') or not resp.strip():             continue         elif resp.startswith('whois'):             whois = resp.split(\":\")[1].strip()             break      return whois if whois else False  def get_whois(ip, whois):     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e IP\"\"\"     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     s.connect((whois, 43))     s.send((ip + \"\\r\\n\").encode())     response = b\"\"      while True:         data = s.recv(4096)         response += data         if not data:             break      s.close()     whois_ip = dict()     num = 0      for ln in response.decode().splitlines():         if ln.strip().startswith(\"%\") or not ln.strip():             continue         else:             if ln.strip().split(\": \")[0].strip() in ['created', 'last-modified']:                 dt = datetime.fromisoformat(ln.strip().split(\": \")[1].strip()).strftime(\"%Y-%m-%d %H:%M:%S\")                 whois_ip.update({f'{ln.strip().split(\": \")[0].strip()}_{num}': dt})                 num += 1             else:                 whois_ip.update({ln.strip().split(\": \")[0].strip(): ln.strip().split(\": \")[1].strip()})      return whois_ip if whois_ip else False  def validate_request(ip):     \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 IP       + ip - IP \u0430\u0434\u0440\u0435\u0441\"\"\"     try:         IPv4Address(ip)         if whois := ianna(ip):             time.sleep(1)             if info := get_whois(ip, whois):                 print(info)             else:                 print(\"\u041d\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\")         else:             if info := get_whois(ip, 'whois.ripe.net'):                 print(info)             else:                 print(\"\u041d\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\")     except AddressValueError:         print(\"IP \u0430\u0434\u0440\u0435\u0441 \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439\")     except ConnectionResetError as ex:         print(ex)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u044f OSINT \u2014 <code>virus_total.py<\/code> \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u043d\u0430 \u0432\u0438\u0440\u0443\u0441\u044b, \u0442\u0440\u043e\u044f\u043d\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0430\u043b\u0432\u0430\u0440\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/www.virustotal.com\/gui\/\" rel=\"nofollow noopener noreferrer\">\u0441\u0430\u0439\u0442\u0435 Virus Total<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043c\u0435\u043d\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0441\u0435\u043a\u0446\u0438\u044e API Key. \u041d\u0438\u0436\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u0435 \u0441\u0430\u043c API \u043a\u043b\u044e\u0447:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dv\/96\/ap\/dv96ap-voywnjsvk1no8hscekic.png\" data-src=\"https:\/\/habrastorage.org\/webt\/dv\/96\/ap\/dv96ap-voywnjsvk1no8hscekic.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u0440\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e API-\u043a\u043b\u044e\u0447\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 4 \u043f\u043e\u0438\u0441\u043a\u0430 \/ \u043c\u0438\u043d\u0443\u0442\u0430<\/li>\n<li>\u0414\u043d\u0435\u0432\u043d\u0430\u044f \u043a\u0432\u043e\u0442\u0430 \u2014 500 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \/ \u0434\u0435\u043d\u044c<\/li>\n<li>\u041c\u0435\u0441\u044f\u0447\u043d\u0430\u044f \u043a\u0432\u043e\u0442\u0430 \u2014 15.5 K \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \/ \u043c\u0435\u0441\u044f\u0446<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432 \u043a\u043e\u0434. \u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432 \u043a\u043e\u0434\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"python\">APIKEY='123456abcdef'  # \u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0448 \u043a\u043e\u0434 # ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0431\u0443\u0434\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0430\u0448 \u043a\u043b\u044e\u0447, \u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u044e\u0434\u0435\u0439. \u041e\u043d\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0431\u043e\u0442\u0443, \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0438 \u0442.\u0434., \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 API. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 (\u0434\u0430 \u0438 \u0434\u0430\u0436\u0435 \u0442\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u0441\u0442\u0438\u043b\u044e \u043a\u043e\u0434\u0430).<\/p>\n<p>  <\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\/\u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>settings.py<\/code> \u0438 \u0432 \u043d\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442. \u041d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c 1 \u0441\u043f\u043e\u0441\u043e\u0431, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c API \u043d\u0435 \u0432 \u043a\u043e\u0434\u0435, \u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>python-dotenv<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">pip install python-dotenv<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0444\u0430\u0439\u043b <code>.env<\/code>, \u0438 \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">VIRUS_TOTAL_KEY = \"\u0432\u0430\u0448 \u043a\u043b\u044e\u0447\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e, \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0438\u043a\u0440\u043e-\u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0445\u0435\u0448 \u0444\u0430\u0439\u043b\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445. \u0414\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0438 \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0434\u0430\u0436\u0435 \u0441 \u0441\u0430\u043c\u044b\u043c\u0438 \u043f\u043b\u043e\u0445\u0438\u043c\u0438 \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441\u0430\u043c\u0438 \u2014 \u0432\u0435\u0434\u044c \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043c\u0430\u043b\u0432\u0430\u0440\u044f \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 0, \u0442\u043e \u0443\u0436\u0435 \u043d\u0430\u0448 \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u0430\u043b\u0432\u0430\u0440\u044c \u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u0436\u0434\u0435\u0442 Virus Total!<\/p>\n<p>  <\/p>\n<p>\u0418 \u0435\u0449\u0435, \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0430\u043c\u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0438 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/virustotal.github.io\/vt-py\/index.html\" rel=\"nofollow noopener noreferrer\">vt-py<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b. \u0421\u043e\u0431\u0440\u0430\u043b \u044f \u0438\u0445 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 res, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u043f\u043e <a href=\"https:\/\/github.com\/AlexeevDeveloper\/cobra\/tree\/main\/res\" rel=\"nofollow noopener noreferrer\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import os import json import requests from dotenv import load_dotenv import os from time import perf_counter from hashlib import sha256, sha1, md5 from colorama import Fore, Style import vt import json  # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f load_dotenv()  # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c API-\u043a\u043b\u044e\u0447 VIRUS_TOTAL_API_KEY = os.getenv(\"VIRUS_TOTAL_KEY\")  # \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b signature_resources = ['res\/signatures.txt', 'res\/signatures2.txt',                         'res\/signatures3.txt', 'res\/signatures4.txt']  # \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439, \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0445\u044d\u0448\u0438 \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442\u0443 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435. signature_resource_info = 'res\/signatures_info.json'  def add_signature(new_signature: dict) -> None:     \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0432 \u0431\u0430\u0437\u0443\"\"\"     with open(signature_resource_info, 'r') as file:         signatures_info = json.load(file)      for signature in new_signatures:         signatures_info['name'] = new_signatures['name']         signatures_info['desc'] = new_signatures['desc']         signatures_info['date'] = new_signatures['date']      with open(signature_resource_info, 'a') as file:         json.dump(signatures_info, file, indent=4)      return None  def rewrite_signatures(signatures: dict) -> bool:     \"\"\"\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c \u0411\u0414 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\"\"\"     try:         with open(signature_resource_info, 'w') as file:             json.dump(signatures, file, indent=4)     except Exception as e:         return False     else:         return True  def get_info_signature(signature: str) -> str:     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0438\u0437 \u0411\u0414\"\"\"     with open(signature_resource_info, 'r') as file:         signatures_info = json.load(file)      try:         signature_info = f'''\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430: {signature} \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0433\u0440\u043e\u0437\u044b: {signatures_info[signature][\"name\"]} \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0433\u0440\u043e\u0437\u044b: {signatures_info[signature][\"desc\"]} \u0414\u0430\u0442\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0443\u0433\u0440\u043e\u0437\u0430: {signatures_info[signature][\"date\"]}'''     except IndexError:         signature_info = f'\u041f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 {signature} \u0435\u0449\u0435 \u043d\u0435\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043d\u0430\u0448\u0438\u0445 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445'     finally:         return signature_info  def scan_file(filename: str, delete_file: bool, signature_resources: list, VT_API_KEY: str) -> None:     \"\"\"\u0421\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b       + filename: str - \u043f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430      + delete_file: bool - \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043b\u0438 \u0444\u0430\u0439\u043b      + signature_resources: list - \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440      + VT_API_KEY: str - API \u043a\u043b\u044e\u0447 Virus Total\"\"\"     result = f'\u0421\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c {filename} \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u0433\u0440\u043e\u0437...\\n'      try:         print('Load singatures...')         start = perf_counter()         shahash = sha256()         sha1hash = sha1()         md5hash = md5()          # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0445\u044d\u0448\u0438         with open(filename, 'rb') as file:             while True:                 data = file.read()                 if not data:                     break                 shahash.update(data) # sha256                 sha1hash.update(data) # sha1                 md5hash.update(data) #md5              result1 = shahash.hexdigest()             result2 = sha1hash.hexdigest()             result3 = md5hash.hexdigest()             result += f'\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0445\u0435\u0448\u0435\u0439 \"{result1}\", \"{result2}\", \"{result3}\" (sha256, sha1, md5) \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445...\\n'          # \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b         with open(signature_resources[0], 'r') as r:             signatures = list(r.read().split('\\n'))          with open(signature_resources[1], 'r') as r:             for sign_hash2 in list(r.read().replace(';', '').split('\\n')):                 signatures.append(sign_hash2)          with open(signature_resources[2], 'r') as r:             for sign_hash3 in list(r.read().replace(';', '').split('\\n')):                 signatures.append(sign_hash3)          with open(signature_resources[3], 'r') as r:             for sign_hash4 in list(r.read().replace(';', '').split('\\n')):                 signatures.append(sign_hash4)          result += f'''\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 {filename} \u043d\u0430 Virus Total...\\n'''          print('Loading Virus Total...')         client = vt.Client(VT_API_KEY)          # \u0430\u043d\u0430\u043b\u0438\u0437 \u0444\u0430\u0439\u043b\u0430         with open(filename, \"rb\") as f:             analysis = client.scan_file(f, wait_for_completion=True)             file = client.get_object(f\"\/files\/{result1}\")             stats = file.last_analysis_stats              result += f'VirusTotal: {filename}\\t size: {file.size} bytes\\n'             result += f'\u0411\u0435\u0437\u0432\u0440\u0435\u0434\u043d\u044b\u0439: {stats[\"harmless\"]}\\n'             result += f'\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f: {stats[\"type-unsupported\"]}\\n'             result += f'\u041f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439: {stats[\"suspicious\"]}\\n'             result += f'\u041e\u0442\u043a\u0430\u0437: {stats[\"failure\"]}\\n'             result += f'\u0417\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0439: {stats[\"malicious\"]}\\n'             result += f'\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439: {stats[\"undetected\"]}\\n'          print('Get final info...')          if result1 in signatures or result2 in signatures or result3 in signatures:             end = perf_counter()             total = end - start             result += f'\u041d\u0430\u0439\u0434\u0435\u043d\u0430 \u0443\u0433\u0440\u043e\u0437\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 {filename} (\u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u043c)\\n'              # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u0430\u0439\u043b\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445             if result in signatures:                 info = get_info_signature(result)                 result += f'\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: {info}\\n'             elif result2 in signatures:                 info = get_info_signature(result2)                 result += f'\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: {info}\\n'             elif result3 in signatures:                 info = get_info_signature(result3)                 result += f'\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: {info}\\n'              # \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430             if delete_file:                 os.remove(filename)                 result += f'[!] \u0424\u0430\u0439\u043b {filename} \u0443\u0434\u0430\u043b\u0435\u043d!\\n'              result += f'\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b: {(total):.07f}s\\n'         else:             end = perf_counter()             total = end - start             result += '\u0423\u0433\u0440\u043e\u0437 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\\n'             result += f'\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b: {(total):.07f}s\\n'     except FileNotFoundError:         result += f'[!] \u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\\n'     except PermissionError:         result += f'[!] \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0443\\n'      print('End')      return result  res = scan_file('&lt;\u043b\u044e\u0431\u043e\u0439 \u0444\u0430\u0439\u043b>', False, signature_resources, VIRUS_TOTAL_API_KEY) print(res)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435 \u2014 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0430 Virus Total.<\/p>\n<p>  <\/p>\n<h1 id=\"modul-scanners\">\u041c\u043e\u0434\u0443\u043b\u044c <code>scanners<\/code><\/h1>\n<p>  <\/p>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c \u0432\u0441\u0435\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432. \u041f\u041e\u043a\u0430 \u0435\u0441\u0442\u044c 6 \u2014 \u043f\u043e\u0438\u0441\u043a IP \u0432 \u0447\u0435\u0440\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445 DNS, \u043f\u0430\u0440\u0441\u0435\u0440 \u0441\u0441\u044b\u043b\u043e\u043a, \u0441\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432, \u0441\u043a\u0430\u043d\u0435\u0440 \u043d\u0430 SQL-Injection \u0438 XSS \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 ARP-\u0441\u043f\u0443\u0444\u0438\u043d\u0433\u0430 \u0438 \u0441\u043a\u0430\u043d\u0435\u0440 \u0441\u0435\u0441\u0441\u0438\u0439 meterpreter \u0434\u043b\u044f Windows.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u043c ARP \u0441\u043f\u0443\u0444\u0438\u043d\u0433\u0430. ARP-spoofing \u2014 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0442\u0430\u043a\u0438 \u0442\u0438\u043f\u0430 MITM, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0432 \u0441\u0435\u0442\u044f\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 ARP. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0435\u0442\u044f\u0445 Ethernet. \u0410\u0442\u0430\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 ARP.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/scapy.readthedocs.io\/\" rel=\"nofollow noopener noreferrer\">scapy<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">from scapy.all import sniff  class ARPSpoofingDetector:     def __init__(self):         self.IP_MAC_Map = {}      def process_packet(self):         src_IP = packet['ARP'].psrc         src_MAC = packet['Ether'].src          if src_MAC in self.IP_MAC_Map.keys():             if self.IP_MAC_Map[src_MAC] != src_IP :                 try:                     old_IP = self.IP_MAC_Map[src_MAC]                 except:                     old_IP = \"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439\"                  message = f'''ARP \u0430\u0442\u0430\u043a\u0430 \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u0430 \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043c\u0430\u0448\u0438\u043d\u044b \u0441 IP \u0430\u0434\u0440\u0435\u0441\u043e\u043c {old_IP} \u0434\u043b\u044f {src_IP}'''                  return message             else:                 self.IP_MAC_Map[src_MAC] = src_IP      def sniffing(self):         # \"\u041d\u044e\u0445\u0430\u0435\u043c\" \u043f\u0430\u043a\u0435\u0442\u044b         sniff(count=0, filter=\"arp\", store=0, prn=self.process_packet)  arpspoof_detector = ARPSpoofingDetector() arpspoof_detector.sniffing()<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u0441\u043a\u0430\u043d\u0435\u0440 meterpreter \u0441\u0435\u0441\u0441\u0438\u0439 \u0434\u043b\u044f Windows 7 \u0438 10.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import re import subprocess from typing import List, Dict  WIN_7_SIGNATURE = [\"WINBRAND.dll\", \"WINHTTP.dll\", \"webio.dll\", \"SspiCli.dll\", \"cscapi.dll\"] WIN_10_SIGNATURE = [\"rsaenh.dll\", \"netapi32.dll\", \"wkscli.dll\", \"psapi.dll\", \"cscapi.dll\"]  REG_FOR_WINDOWS_VERSION = r'(?:Windows\\s+)(\\d+|XP|\\d+\\.\\d+)' REG_FOR_EXE_PROCESSES = r'(?&lt;=\\\\r\\\\n)[A-Za-z]+\\.exe\\s+\\d+' REG_FOR_LOCAL_SOCKET = r'(?:TCP\\s+)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5})' REG_FOR_REMOTE_SOCKET = r'(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5})\\s+[A-Z]+\\s+(\\d+)'  CMD_NETSTAT_COMMAND = 'netstat -aon |find \/i \"established\"' CMD_TASKLIST_COMMAND = \"tasklist \/M\"  class MeterpreterScanner:     def __init__(self):         self._signatures: List[str] = []         self._processes_with_signatures: List[str] = []         self._processes_with_dynamic_port: List[str] = []         self._suspicious_processes: Dict[str:List[str]] = {}      def _check_windows_version(self) -> None:         \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 windows - 7 \u0438\u043b\u0438 10\"\"\"         info = subprocess.check_output(\"systeminfo\", shell=True)         win = re.findall(REG_FOR_WINDOWS_VERSION, str(info))          if win[0] == '10':             self._signatures = WIN_10_SIGNATURE         elif win[0] == '7':             self._signatures = WIN_7_SIGNATURE         else:             print(\"[X] \u0422\u043e\u043b\u044c\u043a\u043e Windows 7 \u0438\u043b\u0438 Windows 10\")      def _search_process_with_dll(self, dll: str) -> None:         \"\"\"\u041f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441 DLL \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438\"\"\"         output_tasklist = subprocess.check_output(f\"{CMD_TASKLIST_COMMAND} {dll}\", shell=True)         process_list = re.findall(REG_FOR_EXE_PROCESSES, str(output_tasklist))          for process_info in process_list:             process, process_PID = re.split(r'\\s+', process_info)             if process in self._suspicious_processes:                 self._suspicious_processes[f'{process}_{process_PID}'].append(dll)             else:                 self._suspicious_processes[f'{process}_{process_PID}'] = [dll]      def _check_suspicious_process(self) -> None:         \"\"\"\u0421\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b\"\"\"         self._check_windows_version()          for dll in self._signatures:             self._search_process_with_dll(dll)         for proc_info in self._suspicious_processes.items():             proc_name, proc_dlls = proc_info             if len(proc_dlls) == 5:                 print(f\"[-] \u041d\u0430\u0439\u0434\u0435\u043d \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 : {proc_name}\")                 self._processes_with_signatures.append(proc_name)         if not self._processes_with_signatures:             print(\"[+] Meterpreter \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438\")      def _scan_suspicious_ports(self) -> None:         \"\"\"\u0421\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u044b\"\"\"         scan_output = subprocess.check_output(CMD_NETSTAT_COMMAND, shell=True)         local_sockets = re.findall(REG_FOR_LOCAL_SOCKET, str(scan_output))         for l_socket in local_sockets:             l_ip, l_port = l_socket.split(':')             if int(l_port) >= 49152:                 if l_ip != \"127.0.0.1\":                     victim_socket = f\"{l_ip}:{l_port}\"                     data_with_suspicious_socket = scan_output.decode().split(victim_socket)                     suspicious_info = re.findall(REG_FOR_REMOTE_SOCKET, data_with_suspicious_socket[1])[0]                     suspicious_socket, suspicious_PID = suspicious_info                     # \u043f\u043e\u0440\u0442 4444 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 MSF \u0438 meterpreter                     if int(suspicious_socket.split(':')[-1]) == 4444:                         print(f\"[!] \u041d\u0430\u0439\u0434\u0435\u043d\u043e MSF \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: {suspicious_socket}\")                     print(f\"[-] \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 {victim_socket} \u043a {suspicious_socket} \"                           f\"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 PID - {suspicious_PID}\")                     self._processes_with_dynamic_port.append(suspicious_PID)      def finding_meterpreter_sessions(self):         \"\"\"\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0435\u0441\u0441\u0438\u0438 meterpreter\"\"\"         found = False         self._check_suspicious_process()         self._scan_suspicious_ports()          # \u0438\u0449\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441         for proc in self._processes_with_signatures:             proc_name, proc_PID = proc.split('_')             if proc_PID in self._processes_with_dynamic_port:                 print(f'[!] \u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0432 {proc_name} \u0441 PID {proc_PID}')                 found = True          if not found:             print(f\"[+] \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\")  MeterpreterScanner().finding_meterpreter_sessions()<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u043c \u0447\u0435\u0440\u043d\u044b\u0445 \u043b\u0438\u0441\u0442\u043e\u0432 DNS, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 IP \u0432 \u044d\u0442\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import socket import re from ipaddress import ip_network, ip_address from dns import resolver from requests import get, exceptions  def ip_in_range(ip, addr):     \"\"\"\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 IP\"\"\"     if ip_address(ip) in ip_network(addr):         return True     return False  def cloudfare_detect(ip):     \"\"\"\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Cloudfare\"\"\"     list_addr = [\"104.16.0.0\/12\"]      url = 'https:\/\/www.cloudflare.com\/ips-v4'     req = get(url=url)      for adr in req.text.split(\"\\n\"):         list_addr.append(adr)      for addr in list_addr:         detect = ip_in_range(ip, addr)         if detect:             return True     return False  def public_ip():     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 IP\"\"\"     try:         return get('https:\/\/api.ipify.org\/').text     except exceptions.ConnectionError:         return '127.0.0.1'  def dns_bl_check(ip):     bad_dict = dict()     result = str()     req = get('https:\/\/raw.githubusercontent.com\/evgenycc\/DNSBL-list\/main\/DNSBL')     read = req.text.splitlines()      for serv in read:         print(f'Checking... {serv}')         req = f\"{'.'.join(reversed(ip.split('.')))}.{serv.strip()}\"         try:             resolv = resolver.Resolver()             resolv.timeout = 5             resolv.lifetime = 5             resp = resolv.resolve(req, 'A')             resp_txt = resolv.resolve(req, 'TXT')             result += f'{serv.strip():30}: [BAD]\\n'             pattern = r'(?:https?:\\\/\\\/)?(?:[\\w\\.]+)\\.(?:[a-z]{2,6}\\.?)(?:\\\/[\\w\\.]*)*\\\/?'             find = re.findall(pattern, str(resp_txt[0]))             if len(find) == 0:                 find = ['No address']             bad_dict.update({serv.strip(): f'{resp[0]} {find[0]}'})         except resolver.NXDOMAIN:             result += f'{serv.strip():30}: [OK]\\n'         except (resolver.LifetimeTimeout, resolver.NoAnswer):             continue         except Exception as ex:             raise ex             return ('error', ex)      if len(bad_dict) > 0:         result += f'{ip} is found in black list\\n'          for bad in bad_dict:             result += f' - {bad:30} : {bad_dict[bad]}\\n'     else:         result += 'IP is not found in black list\\n'      return (result, 0)  def check_ip_in_black_list(addr_input):     result = ''     result += f'Your public IP: {public_ip()}\\n'      if addr_input.lower() == \"x\":         exit(0)      ip = ''      try:         ip = socket.gethostbyname(addr_input)     except socket.gaierror as ex:         return ex      if cloudfare_detect(ip):         result += f'Cloudfare detected: {ip}\\n'     else:         result += 'Cloudfare not detected\\n'      dnsbl_list = dns_bl_check(ip)      if dnsbl_list[0] is None or dnsbl_list[0] == 'error':         return result     else:         result += dnsbl_list[0]      return result  check_ip_in_black_list('&lt;IP \u0430\u0434\u0440\u0435\u0441>')<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0430\u0440\u0441\u0435\u0440 \u0441\u0441\u044b\u043b\u043e\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup  internal_urls = set() external_urls = set()  def is_valid(url):     \"\"\"\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043b\u0438 URL      \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:         url - \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443     \"\"\"     parsed = urlparse(url)      return bool(parsed.netloc) and bool(parsed.scheme)  def get_all_website_links(url):     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u0441\u0430\u0439\u0442\u0430\"\"\"     urls = set()     domain_name = urlparse(url).netloc     soup = BeautifulSoup(requests.get(url).content, \"html.parser\")      for a_tag in soup.findAll(\"a\"):         href = a_tag.attrs.get(\"href\")          if href == \"\" or href is None:             continue          href = urljoin(url, href)          parsed_href = urlparse(href)         href = parsed_href.scheme + \":\/\/\" + parsed_href.netloc + parsed_href.path          if not is_valid(href):             continue          if href in internal_urls:             continue          if domain_name not in href:             if href not in external_urls:                 print(f\"[!] \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0441\u0441\u044b\u043b\u043a\u0430: {href}\")                 external_urls.add(href)             continue          print(f\"[*] \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0441\u044b\u043b\u043a\u0430: {href}\")         urls.add(href)         internal_urls.add(href)      return urls  def crawl(url, max_urls=30):     \"\"\"\u041f\u0430\u0440\u0441\u0438\u043d\u0433\"\"\"     total_urls_visited = 0      total_urls_visited += 1     print(f\"[*] \u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 {url}\")     links = get_all_website_links(url)      for link in links:         if total_urls_visited > max_urls:             break         crawl(link, max_urls=max_urls)  def get_links(url, max_urls=30):     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438\"\"\"     crawl(url, max_urls)     print(\"[+] \u0412\u0441\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a:\", len(internal_urls))     print(\"[+] \u0412\u0441\u0435\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a:\", len(external_urls))     print(\"[+] \u0412\u0441\u0435\u0433\u043e \u0441\u0441\u044b\u043b\u043e\u043a\", len(external_urls) + len(internal_urls))     print(\"[+] \u0412\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a:\", max_urls)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u0410 \u043c\u044b \u0435\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u044d\u0442\u043e \u0441\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import socket from datetime import datetime  def scan_ports(hostname):     start = datetime.now()      ports = {         20: \"FTP-DATA\", 21: \"FTP\", 22: \"SSH\", 23: \"Telnet\",         25: \"SMTP\", 43: \"WHOIS\", 53: \"DNS\", 80: \"http\",         115: \"SFTP\", 123: \"NTP\", 143: \"IMAP\", 161: \"SNMP\",         179: \"BGP\", 443: \"HTTPS\", 445: \"MICROSOFT-DS\",         514: \"SYSLOG\", 515: \"PRINTER\", 993: \"IMAPS\",         995: \"POP3S\", 1080: \"SOCKS\", 1194: \"OpenVPN\",         1433: \"SQL Server\", 1723: \"PPTP\", 3128: \"HTTP\",         3268: \"LDAP\", 3306: \"MySQL\", 3389: \"RDP\",         5432: \"PostgreSQL\", 5900: \"VNC\", 8080: \"Tomcat\", 10000: \"Webmin\"     }      open_ports = []     closed_ports = []     [i for i in range(1, 65355)]      ip = socket.gethostbyname(hostname)      for port in range(65535):         cont = socket.socket()         cont.settimeout(1)          # \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f         try:             cont.connect((ip, port))         except socket.error:             print(f'[!] \u041f\u043e\u0440\u0442 {port} \u0437\u0430\u043a\u0440\u044b\u0442')             closed_ports.append([port])         else:             # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0442\u0438\u043f \u043f\u043e\u0440\u0442\u0430             try:                 print(f\"[{socket.gethostbyname(ip)}:{str(port)}] \u043e\u0442\u043a\u0440\u044b\u0442\/{ports[port]}\")                 open_ports.append({port, ports[port]})             except KeyError:                 print(f\"[{socket.gethostbyname(ip)}:{str(port)}] \u043e\u0442\u043a\u0440\u044b\u0442\/\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f\")                 open_ports.append({port, '\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f'})             finally:                 cont.close()      ends = datetime.now()     print(\"&lt;\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b:{}>\".format(ends - start))      print('[+] \u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u0440\u0442\u044b: ')     for closed_port in closed_ports:         print(closed_port, end=', ')      print()      print('[+] \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u0440\u0442\u044b: ')     for open_port in open_ports:         print(open_port)  scan_ports('&lt;IP \u0430\u0434\u0440\u0435\u0441>')<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u043f\u043e\u0438\u0441\u043a SQL-Injection \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 SQL-\u043a\u043e\u0434\u0430 \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0432\u0437\u043b\u043e\u043c\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e SQL-\u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import requests from bs4 import BeautifulSoup as bs from urllib.parse import urljoin from pprint import pprint  def get_session(user_agent):     session = requests.Session()     session.headers[\"User-Agent\"] = user_agent      return session  def get_all_forms(session, url):     \"\"\"\u0414\u0430\u0435\u0442\u0441\u044f `url`, \u0438 \u044d\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u0435\u0441\u044c html-\u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438\"\"\"     soup = bs(session.get(url).content, \"html.parser\")      return soup.find_all(\"form\")  def get_form_details(form):     \"\"\"     \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0444\u043e\u0440\u043c\u0435     \"\"\"     details = {}      # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0444\u043e\u0440\u043c\u044b (url \u0446\u0435\u043b\u0438)     try:         action = form.attrsession.get(\"action\").lower()     except:         action = None      # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0444\u043e\u0440\u043c\u044b (POST, GET, etc.)     method = form.attrsession.get(\"method\", \"get\").lower()      # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0432\u0432\u043e\u0434\u0430     inputs = []      for input_tag in form.find_all(\"input\"):         input_type = input_tag.attrsession.get(\"type\", \"text\")         input_name = input_tag.attrsession.get(\"name\")         input_value = input_tag.attrsession.get(\"value\", \"\")         inputsession.append({\"type\": input_type, \"name\": input_name, \"value\": input_value})      # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u0435\u0442\u0430\u043b\u0435\u0439     details[\"action\"] = action     details[\"method\"] = method     details[\"inputs\"] = inputs      return details  def is_vulnerable(response):     \"\"\"\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0430\u044f, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430     \u0443\u044f\u0437\u0432\u0438\u043c\u0430 \u043b\u0438 SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0438\u0437-\u0437\u0430 \u0435\u0435 \u00ab\u043e\u0442\u0432\u0435\u0442\u0430\u00bb\"\"\"      errors = {         # MySQL         \"you have an error in your sql syntax;\",         \"warning: mysql\",         # SQL Server         \"unclosed quotation mark after the character string\",         # Oracle         \"quoted string not properly terminated\",     }      for error in errors:         # \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c True         if error in response.content.decode().lower():             return True      # \u041d\u0435\u0442\u0443 \u043e\u0448\u0438\u0431\u043e\u043a     return False  def scan_sql_injection(session, url):     \"\"\"\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 URL \u043d\u0430 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u044f\u0438\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438\"\"\"      for c in \"\\\"'\":         # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0432\u044b\u0447\u043a\u0443 \u043a URL         new_url = f\"{url}{c}\"         print(\"[!] \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u043d\u0430\", new_url)         # \u0421\u043e\u0437\u0434\u0430\u0435\u043c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441         res = session.get(new_url)         if is_vulnerable(res):             # SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c URL-\u0430\u0434\u0440\u0435\u0441\u0435,              # \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u044b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445             print(\"[+] SQL \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0441\u0441\u044b\u043b\u043a\u0430:\", new_url)             return      # \u0410\u043d\u0430\u043b\u0438\u0437 \u0444\u043e\u0440\u043c     forms = get_all_forms(session, url)     print(f\"[+] \u041d\u0430\u0439\u0434\u0435\u043d\u043e {len(forms)} \u0444\u043e\u0440\u043c \u043d\u0430 {url}.\")      for form in forms:         form_details = get_form_details(form)         for c in \"\\\"'\":             # \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043b\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438             data = {}             for input_tag in form_details[\"inputs\"]:                 if input_tag[\"type\"] == \"hidden\" or input_tag[\"value\"]:                     # \u043b\u044e\u0431\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0432\u0432\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u0440\u044b\u0442\u0430 \u0438\u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435,                     # \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u0442\u0435\u043b\u0435 \u0444\u043e\u0440\u043c\u044b                     try:                         data[input_tag[\"name\"]] = input_tag[\"value\"] + c                     except:                         pass                 elif input_tag[\"type\"] != \"submit\":                     # \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435, \u043a\u0440\u043e\u043c\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c                     data[input_tag[\"name\"]] = f\"test{c}\"              # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a URL \u0441\u0441\u044b\u043b\u043a\u0443 \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0438\u0437 \u0444\u043e\u0440\u043c\u044b             url = urljoin(url, form_details[\"action\"])              if form_details[\"method\"] == \"post\":                 res = session.post(url, data=data)             elif form_details[\"method\"] == \"get\":                 res = session.get(url, params=data)              if is_vulnerable(res):                 print(\"[+] SQL Injection vulnerability detected, link:\", url)                 print(\"[+] Form:\")                 pprint(form_details)                 break  def scanning(fua, url):     \"\"\"fua - \u044e\u0437\u0435\u0440 \u0430\u0433\u0435\u043d\u0442, url - \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0430\u0439\u0442\"\"\"     session = get_session(fua)     scan_sql_injection(session, url)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u043c XSS-\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (\u043c\u0435\u0436\u0441\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u0438\u043d\u0433). XSS \u2014 \u0442\u0438\u043f \u0430\u0442\u0430\u043a\u0438 \u043d\u0430 \u0432\u0435\u0431-\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u0432 \u0432\u044b\u0434\u0430\u0432\u0430\u0435\u043c\u0443\u044e \u0432\u0435\u0431-\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0430. \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0442\u0430\u043a\u0438 \u00ab\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430\u00bb. \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import requests from pprint import pprint from bs4 import BeautifulSoup as bs from urllib.parse import urljoin  def get_all_forms(url, fua):     \"\"\"\u0412\u0432\u043e\u0434\u0438\u0442\u0441\u044f `url`, \u044d\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u043e\u0440\u043c\u044b \u0438\u0437 HTML-\u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430     fua - \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u044e\u0437\u0435\u0440 \u0430\u0433\u0435\u043d\u0442\"\"\"     headers = {         'User-Agent': fua     }      soup = bs(requests.get(url, headers=headers).content, \"html.parser\")     return soup.find_all(\"form\")  def get_form_details(form):     \"\"\"\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 HTML-\u0444\u043e\u0440\u043c\u044b\"\"\"     details = {}     # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0444\u043e\u0440\u043c\u044b     action = form.attrs.get(\"action\", \"\").lower()      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0444\u043e\u0440\u043c\u044b (POST, GET, etc.)     method = form.attrs.get(\"method\", \"get\").lower()      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043d\u043f\u0443\u0442\u044b     inputs = []      for input_tag in form.find_all(\"input\"):         input_type = input_tag.attrs.get(\"type\", \"text\")         input_name = input_tag.attrs.get(\"name\")         inputs.append({\"type\": input_type, \"name\": input_name})      # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0434\u0435\u0442\u0430\u043b\u0438     details[\"action\"] = action     details[\"method\"] = method     details[\"inputs\"] = inputs      return details  def submit_form(form_details, url, value):     \"\"\"     \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b     \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HTTP \u043e\u0442\u0432\u0435\u0442     \"\"\"     target_url = urljoin(url, form_details[\"action\"])     inputs = form_details[\"inputs\"]     data = {}      for input in inputs:         # \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 `value`         if input[\"type\"] == \"text\" or input[\"type\"] == \"search\":             input[\"value\"] = value          input_name = input.get(\"name\")         input_value = input.get(\"value\")          if input_name and input_value:             data[input_name] = input_value      print(f\"[+] \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 {target_url}\")     print(f\"[+] \u0414\u0430\u043d\u043d\u044b\u0435: {data}\")      if form_details[\"method\"] == \"post\":         return requests.post(target_url, data=data)     else:         # GET request         return requests.get(target_url, params=data)  def scan_xss(url, fua):     \"\"\"     \u041f\u043e\u043b\u0443\u0447\u0438\u0432 `url`, \u043e\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0444\u043e\u0440\u043c\u044b, \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u0435 \u0434\u043b\u044f XSS, \u0438     \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u0443\u044f\u0437\u0432\u0438\u043c, False \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435     \"\"\"     forms = get_all_forms(url, fua)      print(f\"[+] \u041d\u0430\u0439\u0434\u0435\u043d\u043e {len(forms)} \u0444\u043e\u0440\u043c \u043d\u0430 {url}.\")      js_script = \"&lt;Script>alert('Detected')&lt;\/script>\"     is_vulnerable = False      for form in forms:         form_details = get_form_details(form)         content = submit_form(form_details, url, js_script).content.decode()         if js_script in content:             print(f\"[+] XSS \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043d\u0430 {url}\")             print(\"[*] \u0414\u0435\u0442\u0430\u043b\u0438 \u0444\u043e\u0440\u043c\u044b:\")             pprint(form_details)             is_vulnerable = True      return is_vulnerable  if __name__ == \"__main__\":     url = \"https:\/\/xss-game.appspot.com\/level1\/frame\"     print(scan_xss(url, '&lt;\u044e\u0437\u0435\u0440 \u0430\u0433\u0435\u043d\u0442>'))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Python, \u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0430\u0448\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043a\u043e\u0434, \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u0410 \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438? \u041e\u0431\u043e \u0432\u0441\u0435\u043c \u044d\u0442\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0442\u0430\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043a\u0440\u0430\u0441\u043e\u0442\u0443 \u043d\u0430\u0432\u043e\u0434\u0438\u0442\u044c, \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<h1 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 OSINT (\u0434\u0430 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e OSINT) \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0432\u0430\u0448\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043a\u0440\u0438\u0442\u0438\u043a\u0443. \u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u0433\u043e\u0434\u0438\u0442\u044c, \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u043c\u043e\u0439 \u043a\u043e\u0434 \u0431\u044b\u043b \u0441\u043a\u043e\u043f\u043b\u0435\u043d \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043a\u043e\u0434\u0438\u043d\u0433\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0443\u0436\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u0440\u043e\u0448\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u044f \u0432\u043d\u0435\u0441\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 Python \u043a\u043e\u0434\u0430, \u0433\u0430\u0439\u0434\u043e\u0432 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0433\u0430\u0439\u0434\u043e\u0432 \u0432\u044b <a href=\"https:\/\/t.me\/+oASXM_Y_EgphNTky\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043c\u043e\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u0435<\/a>, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u0433\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f!<\/p>\n<p>  <\/p>\n<h2 id=\"ssylki\">\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/AlexeevDeveloper\/cobra\" rel=\"nofollow noopener noreferrer\">GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>. \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043e\u043d \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e.<br \/> \n<ul>\n<li><a href=\"https:\/\/github.com\/OffcierCia\/non-typical-OSINT-guide\" rel=\"nofollow noopener noreferrer\">\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0433\u0430\u0439\u0434 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u043c \u043f\u043e OSINT.<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/816889\/\"> https:\/\/habr.com\/ru\/articles\/816889\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h1 id=\"kobra-sozdaem-osint-instrument-na-python-chast-1\">\u041a\u043e\u0431\u0440\u0430: \u0441\u043e\u0437\u0434\u0430\u0435\u043c OSINT \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0430 Python, \u0447\u0430\u0441\u0442\u044c 1<\/h1>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0436\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 OSINT-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 Python.<\/p>\n<p>  <\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0446\u0435\u043b\u044f\u0445 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f, \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0431\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 IP \u0430\u0434\u0440\u0435\u0441\u0435<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043d\u043e\u043c\u0435\u0440\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0435\u0441\u0442\u044c \u043b\u0438 IP \u0432 \u0447\u0435\u0440\u043d\u044b\u0445 \u043b\u0438\u0441\u0442\u0430\u0445 DNS<\/li>\n<li>\u041f\u0430\u0440\u0441\u0435\u0440 \u0432\u0441\u0435\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u0441\u0430\u0439\u0442\u0430<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432<\/li>\n<li>SYN-\u0441\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0440\u0442\u043e\u0432<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 \u0441\u0435\u0441\u0441\u0438\u0439 Meterpreter \u0434\u043b\u044f Windows 7\/10<\/li>\n<li>Virus Total API<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 SQL \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439<\/li>\n<li>\u0421\u043a\u0430\u043d\u0435\u0440 XSS \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/li>\n<li>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0444\u0435\u0439\u043a\u043e\u0432\u043e\u0433\u043e User-Agent<\/li>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f mac-\u0430\u0434\u0440\u0435\u0441\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 <strong>\u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/strong>, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u0434, \u0443\u043b\u0443\u0447\u0448\u0438\u043c \u0435\u0433\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 CLI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u043d\u043e\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0431\u0443\u0434\u0443 <a href=\"https:\/\/t.me\/+oASXM_Y_EgphNTky\" rel=\"nofollow noopener noreferrer\">\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0435.<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c python-\u043a\u043e\u0434.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-377063","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/377063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=377063"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/377063\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=377063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=377063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=377063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}