먼저 이 포스팅을 하게 된 이유는 학과 과제 중 하나로 진행했던 프로젝트 내용을 기록하기 위함입니다.

최초 프로젝트 구성을 할 때 계획했던 내용은 WebShell의 기능 중에 하나를 이용해서 웹에서도 CLI에 접근을 할 수 있게 하자라는 취지였습니다.

프로젝트 진행 중에 이미 외국에서 관련 프로젝트가 진행되었었고 Butterfly Shell, Shellinabox 등 여러 웹SSH 프로그램들이 개발되어있었고

그 중 그나마 원래 계획했던 부분과 매우 흡사한 기능들이 있는 shellinabox를 선택해 프로젝트를 진행했습니다.

설치도 간단하고 특별한 설정없이도 쉽게 웹SSH 접근이 가능합니다.

아래 포스팅 내용은 간단하게 deb파일을 이용한 설치 방법을 정리 해봤습니다.


Ubuntu (deb 패키지를 이용한 shellinabox 설치)


우선 구글코드나 Github 등을 이용해 deb 파일을 다운 받습니다.

(현재 구글코드에 등록되어있는 shellinabox deb파일은 버전이 너무 낮아 Github에 있는 것을 추천합니다.)

구글코드 - https://code.google.com/p/shellinabox/downloads/list

GitHub - https://github.com/anilgulecha/shellinabox/releases

저는 Github의 파일을 wget을 이용해 다운 받았습니다.

(다운로드 URL : https://github.com/anilgulecha/shellinabox/releases/download/v2.14-5/shellinabox_2.14-5_amd64.deb_)

위 이미지를 보시면 wget을 이용해 파일을 다운 받은 후 mv명령어로 파일명을 바꿨습니다.

처음 다운 받게되면 파일명 뒤에 .deb_ 라고 되어있는데 이걸 .deb로 변경해주어야 정상작동을 합니다.

(Github 파일 업로드 필터에 deb파일이 필터링 되고 있는 것 같았습니다.)

파일명을 바꿨다면 다음은 일반적인 deb파일 설치 방법과 같이 그냥 설치를 하면 됩니다.



설치가 무사히 끝났다면 웹 브라우저를 실행해 주소란에 http://localhost:4200 을 입력하고 접속을 합니다.

접속을 딱! 하면 .. 아래와 같이 인증서 오류가 나거나 IE의 경우 아예 접근이 안될 수도 있습니다.

크롬을 사용한다면 아래와 같은 오류 메시지를 확인할 수 있습니다.


고급을 누르게 되면 위와 같이 나오는데 안전하지 않음으로 이동을 눌러서 접속을 합니다.

그러면 일반적인 로그인 메시지가 뜨면서 아이디와 패스워드를 요구합니다.

그러면 우분투 시스템에서 사용 중인 계정 정보를 입력해주면 됩니다.



이렇게 하면 deb를 이용하여 간단하게 설치를 끝낼 수 있습니다.

프로젝트를 진행하면서 느낀거지만 활용방법은 .. 특별히 없는것 같았습니다.

물론 우분투 내에서 이것저것 추가하여 시스템분야의 워게임을 진행하는 방법도 있지만 제 프로젝트는 더 이상 진행은 하지 않았습니다.


그리고 GitHub shellinabox페이지에 가보신분이라면 아실 수도 있지만 

2.14-5 버전은 자동로그인 기능이 추가되었다고 설명이 되어있는데 GitHub의 2.14-5.deb 파일은 적용이 되어있지 않았었습니다.

2.14-5 버전 소스 내용은 분명 자동로그인 기능이 추가되어있는 것을 확인 할 수 있는데 deb 파일 생성 당시에 추가를 하지 않은것으로 생각되내요

그래서 다음 포스팅은 FreeBSD에서 소스 컴파일을 통해 자동로그인 기능이 추가된 shellinabox 설치 방법에 대해 포스팅할 예정입니다.

' 2016년 이전 > Project' 카테고리의 다른 글

Virtual Jail(V_Jail) 임시  (0) 2011.11.28
드디어..Virtual Jail의 끝이..  (0) 2011.10.14

 

구축 환경

VirtualBox - Fedora 15 (kernel : 2.6.40.4-5.fc15.i686.PAE)

 

작동 원리

chroot유저 ssh 접속 -> 접속유저의 홈디렉토리 밑 .ssh의 rc 파일 실행 -> daemonstart실행 -> daemon 작동 -> 접속 유저만의 Jail 디렉토리 생성 -> 접속 유저의 .bashrc 의 chroot 명령어 실행 -> V_Jail 접속 완료

 

chroot 구축에 필요한 파일 목록

/chroot/bin/

/chroot/dev/ : null zero

/chroot/home/ : Jail을 이용할 사용자 홈디렉토리

/chroot/lib/

/chroot/etc/

 

/chroot/usr/bin/

/chroot/usr/lib/

/chroot/usr/share/    (아래 두 디렉토리를 원본그대로 Copy )

 

V_Jail - Daemon & Daemonstart Code & fifo.h Code

- fifo.h -

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

 

#define SV_FIFO_NAME "/tmp/fifo/sv_fifo"

#define CL_FIFO_NAME "/tmp/fifo/cl_%d_fifo"

 

struct data_to_pass_st

{

pid_t client_pid;

};

 

- Daemon.c -

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <stdlib.h>

#include "fifo.h"

#include <ctype.h>

 

void hand(int signum);

int main()

{

pid_t pid;

 

if (( pid = fork()) < 0)

    {

exit(0);

    }

else if(pid != 0)

{

exit(0);

}

signal(SIGHUP, SIG_IGN);

close(0);

close(1);

close(2);

 

    setsid();

while(1)

{

struct sigaction act;

sigset_t set;

 

sigemptyset(&(act.sa_mask));

sigaddset(&(act.sa_mask), SIGUSR1);

 

act.sa_handler = hand;

sigaction(SIGUSR1, &act, NULL);

 

sleep(1);

}

}

 

void hand(int signum)

{

if(signum == SIGUSR1)

{

int sv_fifo_fd, cl_fifo_fd;

struct data_to_pass_st fifo_data;

int read_res;

char cl_fifo[256];

char path_1[128];

char path_2[128];

        char mnt[128]; //아래 이미지에 없는 것. 새로 추가됨

 

mkfifo(SV_FIFO_NAME, 0777);

sv_fifo_fd = open(SV_FIFO_NAME, O_RDONLY);

if (sv_fifo_fd == -1)

{

exit(EXIT_FAILURE);

}

while(1)

{

read_res = read(sv_fifo_fd, &fifo_data, sizeof(fifo_data));

if (read_res > 0)

{

sprintf(cl_fifo, CL_FIFO_NAME, fifo_data.client_pid);

cl_fifo_fd = open(cl_fifo, O_WRONLY);

 

if(cl_fifo_fd != -1)

{

sprintf(path_1, "mkdir /V_Jail/%d", fifo_data.client_pid);

sprintf(path_2, "cp –rfp /chroot/* /V_Jail/%d", fifo_data.client_pid);

                    sprintf(mnt, "mount -t proc /proc/ /V_Jail/%d/proc", fifo_data.client_pid); //아래 이미지에 없는 것. 새로 추가됨

system(path_1);

system(path_2);

                    system(mnt);

write(cl_fifo_fd, &fifo_data, sizeof(fifo_data));

close(cl_fifo_fd);

}

}

}

close(sv_fifo_fd);

unlink(SV_FIFO_NAME);

exit(EXIT_SUCCESS);

}

}

- Daemonstart.c –

#include "fifo.h"

#include <ctype.h>

 

int main()

{

system("sudo kill -10 1234"); // 1234란에는 Daemon 의 PID 입력

int sv_fifo_fd, cl_fifo_fd;

struct data_to_pass_st fifo_data;

char cl_fifo[256];

 

sv_fifo_fd = open(SV_FIFO_NAME, O_WRONLY);

if(sv_fifo_fd == 1)

{

printf("Fail_1");

exit(EXIT_FAILURE);

}

fifo_data.client_pid = getppid();

sprintf(cl_fifo, CL_FIFO_NAME, fifo_data.client_pid);

if(mkfifo(cl_fifo, 0777) == -1)

{

printf("Fail_2");

exit(EXIT_FAILURE);

}

write(sv_fifo_fd, &fifo_data, sizeof(fifo_data));

cl_fifo_fd = open(cl_fifo, O_RDONLY);

if(cl_fifo_fd != -1)

{

if(read(cl_fifo_fd, &fifo_data, sizeof(fifo_data)) > 0 )

{

            //이 부분은 IPS가 성공했을 때 실행할 코드

}

close(cl_fifo_fd);

}

close(sv_fifo_fd);

unlink(cl_fifo);

exit(EXIT_SUCCESS);

}

 

V_Jail을 사용할 사용자의 rc(~/.ssh/rc) Code & .bashrc

- rc –

#!/bin/bash

 

trap "" 2 3 9

echo "Connecting....Please Wait..."

sudo /home/chroottest/.ssh/fifotest2 &

# 위 경로는 fifotest2 가 있는 경로로 바꿀 수 있음.

 

while [ 1 ]

do

if [ -d /V_Jail/$! ] && [ -e /V_Jail/$!/etc/passwd ] && [ -d /V_Jail/$!/home/chroottest ] && [ -d /V_Jail/$!/usr/share/vim/vimfiles/tutor ] && [ -e /V_Jail/$!/usr/bin/whoami ]

then

echo "Welcome !!"

echo $! > ./.ssh/ppid

break;

fi

done

 

- .bashrc -

# .bashrc

 

trap "" 2 3 9

# Source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

 

# User specific aliases and functions

var=$(echo $SSH_TTY | awk -F/ '{print $4}')

ppid=$(cat .ssh/ppid_$var)

 

chroot --userspec=chroottest:Jail /V_Jail/$ppid /bin/bash

# --userspec의 내용은 사용할 사용자의 정보로 바꾸어야함

visudo 의 추가내용

chroottest ALL=NOPASSWD:/bin/kill, NOPASSWD:/home/chroottest/.ssh/fifotest2, NOPASSWD:/bin/chown, NOPASSWD:/bin/chmod

 

V_Jail을 사용할 사용자의 rc(~/.ssh/rc) Code(수정 : 종료기 추가)

- rc – (if문 안에 있는 echo들은 빼도 상관없음)

#!/bin/bash

 

trap "echo Warning! Invalid Command!" 2 3 9

 

echo "Connecting....Please Wait..."

sudo /home/ctest/.ssh/connecter-1.0 &

 

var=$(echo $SSH_TTY | awk -F/ '{print $4}')

echo $! > .ssh/ppid_$var

 

while [ 1 ]

do

if [ -d /V_Jail/$! ] && [ -e /V_Jail/$!/etc/passwd ] && [ -d /V_Jail/$!/home/chroottest ] && [ -d /V_Jail/$!/usr/share/vim/vimfiles/tutor ] && [ -e /V_Jail/$!/usr/bin/whoami ]

then

#exit 만드는 부분

#var=$(echo $SSH_TTY | awk -F/ '{print $4}')

echo "1"

ptsnum=$(echo $SSH_TTY | awk -F/ '{print $4}')

echo "2"

ptsps=$(ps -ef | grep pts/"$ptsnum" | grep sshd | awk '{print $2}' | head -1)

echo "3"

cp /home/ctest/exitfirst.c /V_Jail/$!/bin/

echo "3-2"

sed "s/ptsps/$ptsps/g" /V_Jail/$!/bin/exitfirst.c > /V_Jail/$!/bin/exitsecond.c

echo "4"

gcc -o /V_Jail/$!/bin/exit /V_Jail/$!/bin/exitsecond.c

echo "5"

rm -rf /V_Jail/$!/bin/exitfirst.c /V_Jail/$!/bin/exitsecond.c

echo "6"

 

sudo chmod o-w /V_Jail/$!/bin

break;

fi

done

 

 

* 여기까지 접속 관련 *

* 주의 : V_Jail이란 디렉토리와 chroot라는 디렉토리는 / 밑에 있음 *

* 주의 : /chroot/ 안에는 맨 위의 필요한 파일들이 들어 있어야함 *

* 주의 : /V_Jail/ 퍼미션 주의 *

* 참고 : /chroot/bin 퍼미션은 757 이어야함(접속 계정 권한 문제) *

' 2016년 이전 > Project' 카테고리의 다른 글

ShellInaBox을 이용한 웹SSH  (0) 2014.12.29
드디어..Virtual Jail의 끝이..  (0) 2011.10.14

드디어 2년 동안 틈틈히 만들며 수정하고 버리고 다시 만들고 수정하기를 반복한..
Virtual Jail의 끝이 보이려고 하내요..

이걸 만들려고 했던 계기는 1학년 때 sis.or.kr 의 시스템 훈련공간을 보고 반해서...
나도 한번 만들어보자 !! 하면서 시작은 그저 쉘 스크립트로만 만들었었지요...
그렇게 쉘 스크립트만을 가지고 시작한 첫번째 V_Jail 은 겉 모습은 그럴싸 했으나 이곳 저곳 구멍 투성이라 중도 폐기 ..
잠깐의 휴식과 학업에 몰두(?)한 뒤 두번째 V_Jail 제작 돌입 ..!!
약간의 C언어와 쉘스크립트를 섞어서 첫번째 보다는 더 그럴싸하게 제작 .. 하였으나 ..............
그 때 사용 중이던 노트북이 너무 느려 포맷한다는게 그만 C,D 드라이브 모두 포맷....(D에 모든것이 들어있었거늘!!)
그나마 백업을 해놨다고 생각해놨던 외장하드마저도 며칠전에 포맷.... 급히 복구해보려 했으나 이미 때는 늦었었지요 ...
덕분에 V_Jail을 만들겠다는 의지가 급.. 꺾였고 .. 또 다시 한동안 학업에 몰두...

그렇게 세월을 흘려보내던 중 .. 잊고 지내던 V_Jail 이 생각나 다시 제작에 몰입..!!
처음과 다르게 쉘스크립트의 비중을 많이 줄이고 Daemon의 등장 !
거기에 처음만나본 IPC 기술까지 더해져 나름 모양새를 갖추어가기 시작했내요..

접속하는 부분은 어느정도 완성이 되었지만 이제 해야할 일이 많내요 ..
종료하는 부분도 생각해야되고 나름 훈련공간이니 훈련을 할 수 있게도 해주어야 하고 ..
일단 이번 달 내로 완성을 시키고 싶은데 벅차내요 ㅠㅠㅠㅠ

전체적으로 어느 정도 완성이 되면 포팅 해야지...

' 2016년 이전 > Project' 카테고리의 다른 글

ShellInaBox을 이용한 웹SSH  (0) 2014.12.29
Virtual Jail(V_Jail) 임시  (0) 2011.11.28

+ Recent posts