linux sha512加密.docx
- 文档编号:17971163
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:16
- 大小:227.17KB
linux sha512加密.docx
《linux sha512加密.docx》由会员分享,可在线阅读,更多相关《linux sha512加密.docx(16页珍藏版)》请在冰点文库上搜索。
linuxsha512加密
Linux密码加密(sha512)
Shadow密码分析
crypt密文里是由三部分组成的,即:
$id$salt$encrypted
目前常用的是当id为1时,使用md5加密,id为5,采用SHA256进行加密,id为6采用SHA512进行加密。
现在版本较高的ubuntu以及redhat,centos6.0以上等,大部分linux密码都采用了sha512的加密方式.
查看shadow文件:
查看密码加密方式:
写个简短的代码进行试验:
#include
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
if(argc<2)
{
printf("nousrnameinput");
return1;
}
if(geteuid()!
=0)
fprintf(stderr,"mustbesetuidroot");
structpasswd*pwd;
pwd=getpwnam(argv[1]);
if(pwd==NULL)
printf("nousernamefound.\n");
else
{
printf("passwd:
%s\n",pwd->pw_passwd);
if(strcmp(pwd->pw_passwd,"x")==0)
{
printf("shadowused.\n");
structspwd*shd=getspnam(argv[1]);
if(shd!
=NULL)
{
staticcharcrypt_char[80];
strcpy(crypt_char,shd->sp_pwdp);
charsalt[13];
inti=0,j=0;
while(shd->sp_pwdp[i]!
='\0'){
salt[i]=shd->sp_pwdp[i];
if(salt[i]=='$'){
j++;
if(j==3){
salt[i+1]='\0';
break;
}
}
i++;
}
if(j<3)perror("fileerrororusercannotuse.");
if(argc==3)
printf("salt:
%s,crypt:
%s\n",salt,crypt(argv[2],salt));
printf("shadowdpasswd:
%s\n",shd->sp_pwdp);
}
}
}
return0;
}
保存后执行gccpasswd.c-lcrypt-opasswd
编译成功后运行./passwdroot123
其中./passwd是生成的命令,root是我们用来测试的账户,123是测试系统中root用户的密码,执行的结果是:
Shadow文件中的salt:
Linux密码加Salt值,其实是为了增加暴力猜解的难度.
在拿到linuxshadow文件的情况下,实际上salt的值就失去了保护的功能,hash("passwd+salt")后,再经过编码即可得到上图中看到的root:
后面的字符串。
所以破解就是它的反向过程而已。
在passwd.c中,找到了生成salt的函数:
crypt_make_salt
201char*crypt_make_salt(constchar*meth,void*arg)
202{
203/*MaxresultsizefortheSHAmethods:
204*+3$5$
205*+17rounds=999999999$
206*+16salt
207*+1\0
208*/
209staticcharresult[40];
210size_tsalt_len=8;
211constchar*method;
212
213result[0]='\0';
214
215if(NULL!
=meth)
216method=meth;
217else{
218if((method=getdef_str("ENCRYPT_METHOD"))==NULL)
219method=getdef_bool("MD5_CRYPT_ENAB")?
"MD5":
"DES";
220}
221
222if(!
strcmp(method,"MD5")){
223MAGNUM(result,'1');
224#ifdefUSE_SHA_CRYPT
225}elseif(!
strcmp(method,"SHA256")){
226MAGNUM(result,'5');
227strcat(result,SHA_salt_rounds((int*)arg));
228salt_len=SHA_salt_size();
229}elseif(!
strcmp(method,"SHA512")){
230MAGNUM(result,'6');
231strcat(result,SHA_salt_rounds((int*)arg));
232salt_len=SHA_salt_size();
233#endif
234}elseif(0!
=strcmp(method,"DES")){
235fprintf(stderr,
236_("InvalidENCRYPT_METHODvalue:
'%s'.\n"
237"DefaultingtoDES.\n"),
238method);
239result[0]='\0';
240}
241
242/*
243*Concatenateapseudorandomsalt.
244*/
245assert(sizeof(result)>strlen(result)+salt_len);
246strncat(result,gensalt(salt_len),
247sizeof(result)-strlen(result)-1);
248
249returnresult;
250}
除了一大段条件判断语句,其实最重要的只有一句gensalt(salt_len)。
看看gensalt的定义:
168staticchar*gensalt(unsignedintsalt_size)
169{
170staticcharsalt[32];
171
172salt[0]='\0';
173
174assert(salt_size>=MIN_SALT_SIZE&&
175salt_size<=MAX_SALT_SIZE);
176seedRNG();
177strcat(salt,l64a(random()));
178do{
179strcat(salt,l64a(random()));
180}while(strlen(salt) 181salt[salt_size]='\0'; 182 183returnsalt; 184} 其实salt只是某个的固定长度的随机的可见的字符串而已。 所以破解的话就比较简单了。 注: 源代码分析这块是从网上查阅的,我用了尚进提供的debian的源代码中的passwd.c中没有查看到上面所写的代码。 有兴趣的可以找找。 使用john破解linuxshadowsha512: 使用john破解linuxsha512,和破解md5的方法一样,都是将shadow中要破解的一行存放在一个单独的文件中,然后进行破解. 下面的例子以破解root密码为例: 1将shadow文件中的root一行存放在新建的文件password.txt中: 2选择合适的字典进行破解: 破解成功! 低版本John实现linuxsha512破解的方法: 默认情况下,1.7.6以下版本的john是不支持sha512破解的(BT5和kali下的john均高于此版本)。 需要增加一个crypt_fmt.c文件. 具体操作如下: 1首先解压缩john1.75的源代码,vi编辑Makefile文件,添加下面标注好的红色字体 LDFLAGS=-s-lcrypt JOHN_OBJS_MINIMAL=\ DES_fmt.oDES_std.oDES_bs.o\ BSDI_fmt.o\ MD5_fmt.oMD5_std.o\ BF_fmt.oBF_std.o\ AFS_fmt.o\ LM_fmt.o\ batch.obench.ocharset.ocommon.ocompiler.oconfig.ocracker.o\ crc32.oexternal.oformats.ogetopt.oidle.oinc.ojohn.olist.o\ loader.ologger.omath.omemory.omisc.ooptions.oparams.opath.o\ recovery.orpp.orules.osignals.osingle.ostatus.otty.owordlist.o\ unshadow.o\ unafs.o\ unique.o\ crypt_fmt.o 2然后新建一个crypt_fmt.c文件,代码如下 /*publicdomainproof-of-conceptcodebySolarDesigner*/ #define_XOPEN_SOURCE/*forcrypt(3)*/ #include #include #include"arch.h" #include"params.h" #include"formats.h" #defineFORMAT_LABEL"crypt" #defineFORMAT_NAME"genericcrypt(3)" #defineALGORITHM_NAME"? /"ARCH_BITS_STR #defineBENCHMARK_COMMENT"" #defineBENCHMARK_LENGTH0 #definePLAINTEXT_LENGTH72 #defineBINARY_SIZE128 #defineSALT_SIZEBINARY_SIZE #defineMIN_KEYS_PER_CRYPT1 #defineMAX_KEYS_PER_CRYPT1 staticstructfmt_teststests[]={ {"CCNf8Sbh3HDfQ","U*U*U*U*"}, {"CCX.K.MFy4Ois","U*U***U"}, {"CC4rMpbg9AMZ.","U*U***U*"}, {"XXxzOu6maQKqQ","*U*U*U*U"}, {"SDbsugeBiC58A",""}, {NULL} }; staticcharsaved_key[PLAINTEXT_LENGTH+1]; staticcharsaved_salt[SALT_SIZE]; staticchar*crypt_out; staticintvalid(char*ciphertext) { #if1 intl=strlen(ciphertext); returnl>=13&&l #else /*Poorloadtime,butmoreeffectiveatrejectingbad/unsupportedhashes*/ char*r=crypt("",ciphertext); intl=strlen(r); return ! strncmp(r,ciphertext,2)&& l==strlen(ciphertext)&& l>=13&&l #endif } staticvoid*binary(char*ciphertext) { staticcharout[BINARY_SIZE]; strncpy(out,ciphertext,sizeof(out));/*NULpaddingisrequired*/ returnout; } staticvoid*salt(char*ciphertext) { staticcharout[SALT_SIZE]; intcut=sizeof(out); #if1 /*Thispieceisoptional,butmatchingsaltsarenotdetectedwithoutit*/ switch(strlen(ciphertext)){ case13: case24: cut=2; break; case20: if(ciphertext[0]=='_')cut=9; break; case34: if(! strncmp(ciphertext,"$1$",3)){ char*p=strchr(ciphertext+3,'$'); if(p)cut=p-ciphertext; } break; case59: if(! strncmp(ciphertext,"$2$",3))cut=28; break; case60: if(! strncmp(ciphertext,"$2a$",4))cut=29; break; } #endif /*NULpaddingisrequired*/ memset(out,0,sizeof(out)); memcpy(out,ciphertext,cut); returnout; } staticintbinary_hash_0(void*binary) { return((unsignedchar*)binary)[12]&0xF; } staticintbinary_hash_1(void*binary) { return((unsignedchar*)binary)[12]&0xFF; } staticintbinary_hash_2(void*binary) { return (((unsignedchar*)binary)[12]&0xFF)| ((int)(((unsignedchar*)binary)[11]&0xF)<<8); } staticintget_hash_0(intindex) { return(unsignedchar)crypt_out[12]&0xF; } staticintget_hash_1(intindex) { return(unsignedchar)crypt_out[12]&0xFF; } staticintget_hash_2(intindex) { return ((unsignedchar)crypt_out[12]&0xFF)| ((int)((unsignedchar)crypt_out[11]&0xF)<<8); } staticintsalt_hash(void*salt) { intpos=strlen((char*)salt)-2; return (((unsignedchar*)salt)[pos]&0xFF)| ((int)(((unsignedchar*)salt)[pos+1]&3)<<8); } staticvoidset_salt(void*salt) { strcpy(saved_salt,salt); } staticvoidset_key(char*key,intindex) { strcpy(saved_key,key); } staticchar*get_key(intindex) { returnsaved_key; } staticvoidcrypt_all(intcount) { crypt_out=crypt(saved_key,saved_salt); } staticintcmp_all(void*binary,intcount) { return! strcmp((char*)binary,crypt_out); } staticintcmp_exact(char*source,intindex) { return1; } structfmt_mainfmt_crypt={ { FORMAT_LABEL, FORMAT_NAME, ALGORITHM_NAME, BENCHMARK_COMMENT, BENCHMARK_LENGTH, PLAINTEXT_LENGTH, BINARY_SIZE, SALT_SIZE, MIN_KEYS_PER_CRYPT, MAX_KEYS_PER_CRYPT, FMT_CASE|FMT_8_BIT, tests },{ fmt_default_init, valid, fmt_default_split, binary, salt, { binary_hash_0, binary_hash_1, binary_hash_2 }, salt_hash, set_salt, set_key, get_key, fmt_default_clear_keys, crypt_all, { get_hash_0, get_hash_1, get_hash_2 }, cmp_all, cmp_all, cmp_exact } }; 3最后修改john.c文件,添加下面标注的红色字体 externstructfmt_mainfmt_DES,fmt_BSDI,fmt_MD5,fmt_BF; externstructfmt_mainfmt_AFS,fmt_LM; externstructfmt_mainfmt_crypt; john_register_one(&fmt_DES); john_register_one(&fmt_BSDI); john_register_one(&fmt_MD5); john_register_one(&fmt_BF); john_register_one(&fmt_AFS); john_register_one(&fmt_LM); john_register_one(&fmt_crypt); 4编译: #makelinux-x86-sse2 这样就可以支持sha512破解了!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux sha512加密 sha512 加密