FTP 인증에 대해 질문 드리겠습니다.

anaud2의 이미지

안녕하세요 FTP를 수정하기 위해 공부 하고 있는 사회초년생입니다.

제가 가지고 있는 소스는 4~5년정도 지난 logdaemon-5.7 이라는 공개 소스중에서 ftp를 보고 있습니다. 계발환경은 리눅스이구요
여기서 인증이 이루어 지는 부분을 보고 있는데요

소스중에서 보면 우선 사용자가 입력하는 ID를 가지고 에 정의되어 있는 passwd 구조체를 읽어 드립니다.

struct passwd {
        char    *pw_name;       /* 유저 이름 */
        char    *pw_passwd;     /* 유저 패스워드 */
        uid_t   pw_uid;         /* 유저 id */[code]
        gid_t   pw_gid;         /* 그룹 id */
        char    *pw_gecos;      /* 실제 이름 */
        char    *pw_dir;        /* 홈 디렉토리 */
        char    *pw_shell;      /* shell 프로그램 */
}
==============================================================

/*pw <-에 사용자 사용자 아이디를 이용 passwd구조체를 받았다*/

if (!guest) {/* "ftp" is only account allowed no password */
        if (pw == NULL)
            salt = "xx"; 
        else
            salt = pw->pw_passwd; /*게스트 접속이 아닐경우 salt에 pw->passwd값을 넣는다 출력해보면 "x" 가들어있다.
#ifdef KEY
            xpasswd = key_crypt(passwd, salt, pw, pwok); /*KEY 를 define하지 않았음 (무시)*/
#else
            xpasswd = crypt(passwd, salt); 
            /*crypt 함수를 사용 crypt함수는 밑에서 설명 passwd는 사용자(FTP접속자)가 입력을한 비번이다.ex)134679 사용자계정과 비밀번호를 올바르게삽입*/
#endif
         /* The strcmp does not catch null passwords! */
         if (pw == NULL || *pw->pw_passwd == '\0' || strcmp(xpasswd, pw->pw_passwd)) 
         /*사용자 아이디 검사이다. pw->pw_passwd와 xpasswd(위에서 접속자가 입력한 비번과 etc/passwd파일을 읽어들인 구조체의 패스워드와 비교한다.*/
         {
               reply(530, "Login incorrect.");/*아래는 모두 실패했을경우*/
               pw = NULL;
               last.failures++;
               if (login_attempts++ >= 5) {
                      syslog(LOG_ERR,"REPEATED LOGIN FAILURES FROM %.100s, %s",remotehost, last.name);
                      exit(0);
               }
               return;
         }
      }

/**/으로된 한글은 소스를 제가 분석해서 올린것입니다.
요지를 보면 게스트 접속이 아닐경우 /etc/passwd/파일을 읽어 들여서 사용자가 입력한 패스워드를 crypt 함수로 암호화한 값과 같은지 비교를 합니다.
또한 어떤자료에서는 위의 같은 방법으로 인증을 확인을 한다고 써있습니다.
http://www.osxdev.org/smalltalk/read.php?ID=3843

그런데 문제가 현재 etc/passwd파일을 읽어서 구조체 값을 찍어보면 pw->pw_passwd 이값에는 x란 값이 들어있습니다.
etc/passwd파일을 vi로 열어보더라도 아이디:x:UID 등(순서가 좀 틀릴지 모르겠습니다.)으로 되어있습니다.
이부분을 자료를 찾아보니 x라는 값은 패스워드가 etc/shadow 파일에 들어있다는 표시라고 합니다.

그렇다면 저 소스가 정상적으로 돌아가는거 같지 않는데요 제 추측이 맞다면
4~5년 전에는 passwd파일에서 ID:사용자패스워드를 암호화한 값?사용자 패스워드를 암호화할때 사용한 salt값 :UID:GID
이렇게 되어있었다.라고 생각이 되네요 제 생각이 맞나요?

또한 그렇다면 저소스를 수정해야 되는데 shadow 파일에서 패스워드를 암호화한 값이라고 해야할까요 salt에 들어가는 값을 읽어 들여야 할꺼같은데
알고 계신분이 계신다면 도움을 요청 드리겠습니다.

ymir의 이미지


shadow passwd 에 관한 libarary 는 shadow.h 에 정의되어 있습니다.
man getspent 로 확인해 보세요.

struct spwd 구조체의 char *sp_pwdp; 가 encrypt 된 passwd 입니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.