Autor: Sefer | Publicado: 2006-01-29T12:44:00-05:00

Bom pessoal tem um tempão que eu nao coloco nada aqui, o problema é a correria e a minha vida pessoal que esta um pouco baguncadaPuts o underground parece que resfriou novamente, nao vejo muita coisa legal acontecendo...Mas isto nao me desanima nas minhas pesquisas e missoes...Estou fazendo algumas experiencias com coisas novas e legais logo vou estar postando algo sobre estas pesquisas aqui...Hoje, domingo, estava fazendo algumas coisas com raw sockets, para nao enferrujar, quando bati num probleminha, nao estou conseguindo receber com sucesso o resultado deste pacote syn. Se alguem achar o erro ai, me mandem um aviso ou comentem o post ;)#include "stdio.h"#include "stdlib.h"#include "unistd.h"#include "netdb.h"#include "arpa/inet.h"#include "netinet/ip.h"#include "netinet/tcp.h"#include "netinet/in.h"#include "sys/socket.h"#include "sys/types.h"#include "sys/select.h"#include "sys/time.h"#define PSEUDOHDR sizeof(struct pseudohdr)#define TCPHDR sizeof(struct tcphdr)#define IPHDR sizeof(struct iphdr)#define DATA 0struct pseudohdr {                unsigned long saddr;                unsigned long daddr;                char useless;                unsigned char protocol;                unsigned short length;        };unsigned short in_cksum(unsigned short *addr, int len)    {    register int sum = 0;    u_short answer = 0;    register u_short *w = addr;    register int nleft = len;    while (nleft > 1)    {    sum += *w++;    nleft -= 2;    }       if (nleft == 1)    {    *(u_char *) (&answer) = *(u_char *) w;    sum += answer;    }    sum = (sum >> 16) + (sum & 0xffff);    sum += (sum >> 16);    answer = ~sum;    return (answer);        }int main(int argc, char *argv[])    {    int sock=0;    int optval=1;    int port;    int sport=0;    int dstport=0;// counter    int i;    char *pack=NULL;    char  *rpack=NULL;    struct sockaddr_in vitima;       struct iphdr *rip=NULL;    struct tcphdr *rtcp=NULL;//Utilizado para checksum no tcphdr    struct pseudohdr pseudo;    struct iphdr *ip=NULL;    struct tcphdr *tcp=NULL;    if(argc < 5)        {        printf("%s    \n", argv[0]);        exit(1);        }       // criacao do socket    sock = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);    if(sock < 0)        {        printf("Erro ao criar o socket\n");        perror("Socket");        exit(1);        }//reserva de memoria para o pacote    pack = (char *)malloc(IPHDR + TCPHDR + DATA);       if (!pack)        {        perror("Malloc(pack)");        exit(1);        }//apontamento de ip para o comeco do pacote    ip = (struct iphdr *)pack;   //apontamento de tcp para pack + tamanho do iphdr    tcp = (struct tcphdr *)(pack + sizeof(struct iphdr));   //reserva de memoria para pacote respondido    rpack = (char *)malloc(IPHDR+TCPHDR+DATA);       if(!rpack)        {        perror("Malloc(rpack)");        exit(1);        }   // seta opcao de inclusao de hdr pelo programador    if((setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&optval,sizeof(int))) < 0)        {        printf("Erro ao tentar setar opcoes no socket");        exit(1);        }   //constroi o iphdr    ip->ihl = 5;    ip->tos = 0;    ip->version = 4;    ip->ttl = 128; // win box    ip->id = 666;    ip->tot_len = sizeof(struct iphdr) + 452;    ip->protocol = IPPROTO_TCP;    ip->saddr = inet_addr(argv[1]);    ip->daddr = inet_addr(argv[3]);    ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr) + sizeof(struct tcphdr));       sport = atoi(argv[2]);    dstport = atoi(argv[4]);   // constroi o pseudohdr    pseudo.saddr = inet_addr(argv[1]);    pseudo.daddr = inet_addr(argv[3]);    pseudo.useless = 0;    pseudo.protocol = IPPROTO_TCP;    pseudo.length = htons(TCPHDR);   //constroi o tcphdr    tcp->source = htons(sport);    tcp->dest = htons(dstport);    tcp->seq = htons(0);    tcp->ack_seq = htonl(0);    tcp->doff = 5;    tcp->fin = 0;    tcp->syn = 1;    tcp->rst = 0;    tcp->psh = 0;    tcp->ack = 0;    tcp->urg = 0;    tcp->window = htonl(4000);    tcp->urg_ptr = htons(0);    tcp->check = in_cksum((unsigned short *)&pseudo, PSEUDOHDR+TCPHDR);       port = atoi(argv[3]);    vitima.sin_family = PF_INET;    vitima.sin_addr.s_addr = inet_addr(argv[3]);    vitima.sin_port = htons(port);       if((i = sendto(sock, pack, TCPHDR+IPHDR+DATA, 0,(struct sockaddr *)&vitima, sizeof(struct sockaddr))) == -1)        {        printf("Erro ao tentar enviar o pacote!!\n");        exit(1);        }       // Fazer a parte do syn scan    printf("Pacote enviado [%d bytes]\n\n", i);       if((i = recv(sock, rpack, IPHDR+TCPHDR+DATA,0)) == -1)        {        printf("Erro ao tentar receber o pacote de resposta\n");        exit(1);        }              printf("Pacote recebido [%d bytes]:\n", i);//Aponta os offsets dentro do pacote    rip = (struct iphdr *)rpack;    rtcp = (struct tcphdr *)rpack + IPHDR;//Printa as telas    printf("Syn: %x\n", rtcp->syn);    printf("Fin: %x\n", rtcp->fin);    printf("Ack: %x\n", rtcp->ack);    printf("PSH: %x\n", rtcp->psh);    printf("RST: %x\n", rtcp->rst);    printf("URG: %x\n\n", rtcp->urg);           return 0;       }