A autenticação EAP / MSCHAPv2 falha (apenas) no Windows com autenticador personalizado

3
Domokun 2020-08-06 08:42.

Eu tenho um projeto que envolve autenticação de cliente personalizada para a implementação de servidor StrongSwan IKEv2 no Linux.

Estou executando: StrongSwan 5.4.0 com o plugin eap-radius

Atualmente, usamos o FreeRadius para falar EAP-MSCHAPv2 com várias plataformas de cliente (Windows, Mac, Linux). Devido a algumas limitações, precisamos implementar nosso próprio servidor RADIUS "falado" + EAP-MSCHAPv2 para substituir o FreeRadius. Não vou entrar em detalhes sobre por que isso é necessário (mas direi que é necessário), mas estou tendo um problema que não consigo resolver.

Seguindo as especificações RFC para o protocolo RADIUS, bem como os protocolos EAP e MSCHAPv2, criei um servidor POC que autentica clientes. A implementação funciona para todos os clientes Mac OSX, clientes Android (usando o aplicativo Strongswan) e clientes Linux.

Os problemas começam com clientes Windows (Windows 10 + 7 testado). Por algum motivo, o cliente Windows apresenta um erro com o código 691, que é um erro genérico que indica um nome de usuário / senha incorretos ou um protocolo de autenticação incorreto.

Confirmei de várias maneiras que minha implementação EAP-MSCHAPv2 segue as especificações RFC:

RFC MSCHAPv2: https://tools.ietf.org/html/rfc2759

Na parte inferior dessa RFC, existem conjuntos de dados de exemplo. Quando uso o nome de usuário e a senha nesses exemplos, meu código gera a saída correta:

INPUTS:
AuthenticatorChallenge = 5B5D7C7D7B3F2F3E3C2C602132262628
PeerChallenge = 21402324255E262A28295F2B3A337C7E
username = "User"
password = "clientPass"

OUTPUT:
8-octet Challenge: = D02E4386BCE91226
24 octet NT-Response:: 82309ECD8D708B5EA08FAA3981CD83544233114A3D85D6DF
42-octet AuthenticatorResponse: S=407A5589115FD0D6209F510FE9C04566932CDA56

Isso valida que minha implementação está seguindo a especificação RFC para os dados que devem ser calculados durante as partes MSCHAPv2 da conversação EAP. Isso também é confirmado pelo fato de que os clientes Mac, Android e Linux são autenticados com sucesso.

Isso me leva a acreditar que o erro do Windows está relacionado ao formato do pacote, e não aos valores subjacentes sendo gerados pelo meu código. Para isso, habilitei o registro de depuração total no StrongSwan e apontei a autenticação de volta para o FreeRadius, para que eu pudesse registrar uma conversa de autenticação bem-sucedida com o FreeRadius e, em seguida, comparar os pacotes com o meu próprio POC.

A seguir está uma conversa bem-sucedida do Windows EAP com o FreeRadius:

  1. Identidade EAP + Resposta ao Desafio
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> => 168 bytes @ 0x7f55f00014b0
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>    0: 01 F6 00 A8 73 40 3E 5D A8 2A 50 21 53 8E FE 52  [email protected]>].*P!S..R
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>   16: 0F 14 D1 8E 01 12 72 34 32 6D 33 6E 63 76 2D 65  ......r42m3ncv-e
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>   32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00  8wfpg3=.........
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>   48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D  ........W.ikev2-
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>   64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E  mschapv2...4.#..
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>   80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36  196.52.46.35..66
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>   96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 17 02 00  .207.208.226O...
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>  112: 00 15 01 72 34 32 6D 33 6E 63 76 2D 65 38 77 66  ...r42m3ncv-e8wf
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>  128: 70 67 33 20 13 63 61 2D 30 30 31 5F 73 74 72 6F  pg3 .ca-001_stro
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>  144: 6E 67 73 77 61 6E 50 12 E1 CD BD 37 42 F0 6C BE  ngswanP....7B.l.
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1>  160: 64 AB BD F6 19 B6 9A A6                          d.......
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> => 112 bytes @ 0x7f55f0000de0
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>    0: 0B F6 00 70 ED 7D 83 2C AF 6E 81 05 ED E7 73 43  ...p.}.,.n....sC
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>   16: 60 19 76 B7 1A 0C 00 00 01 37 1C 06 0A FF FF 03  `.v......7......
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>   32: 4F 2C 01 01 00 2A 1A 01 01 00 25 10 FC 80 3D 84  O,...*....%...=.
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>   48: 7A A0 ED DC FF E3 CB 7C C3 07 62 FC 72 34 32 6D  z......|..b.r42m
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>   64: 33 6E 63 76 2D 65 38 77 66 70 67 33 50 12 63 4F  3ncv-e8wfpg3P.cO
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>   80: 24 0B F0 D1 B3 09 7B 74 40 5C DF FC FB CC 18 12  $.....{[email protected]\......
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1>   96: 01 A0 90 AE 01 A1 8A DA 3E A1 21 17 0E 05 88 2C  ........>.!....,
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 42 bytes @ 0x7f55f0000ee0
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1>    0: 01 01 00 2A 1A 01 01 00 25 10 FC 80 3D 84 7A A0  ...*....%...=.z.
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1>   16: ED DC FF E3 CB 7C C3 07 62 FC 72 34 32 6D 33 6E  .....|..b.r42m3n
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1>   32: 63 76 2D 65 38 77 66 70 67 33                    cv-e8wfpg3
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> initiating EAP_MSCHAPV2 method (id 0x01)
  1. Resposta do pacote de solicitação EAP + pacote de sucesso (desafio de acesso):
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> => 240 bytes @ 0x7f5618001570
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>    0: 01 F7 00 F0 8A 5D 27 E3 01 D1 65 4C 07 7B CC 4A  .....]'...eL.{.J
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   16: 41 12 87 95 01 12 72 34 32 6D 33 6E 63 76 2D 65  A.....r42m3ncv-e
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00  8wfpg3=.........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D  ........W.ikev2-
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E  mschapv2...4.#..
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36  196.52.46.35..66
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 4D 02 01  .207.208.226OM..
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  112: 00 4B 1A 02 01 00 46 31 7F D3 69 D7 24 FB 6A 9E  .K....F1..i.$.j.
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  128: 22 39 C7 3F B0 43 94 3C 00 00 00 00 00 00 00 00  "9.?.C.<........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  144: 76 E7 D7 C3 6B 69 85 B0 1F 7E EF 8D 11 C6 78 28  v...ki...~....x(
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  160: D3 F4 78 04 40 BD BD 39 00 72 34 32 6D 33 6E 63  [email protected]
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  176: 76 2D 65 38 77 66 70 67 33 20 13 63 61 2D 30 30  v-e8wfpg3 .ca-00
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  192: 31 5F 73 74 72 6F 6E 67 73 77 61 6E 18 12 01 A0  1_strongswan....
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  208: 90 AE 01 A1 8A DA 3E A1 21 17 0E 05 88 2C 50 12  ......>.!....,P.
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  224: 73 4F EF F8 F6 08 B9 31 DA FC 35 25 0F CF 00 30  sO.....1..5%...0
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> => 121 bytes @ 0x7f5618001160
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>    0: 0B F7 00 79 F6 E1 7C CC C5 C7 FA 31 F7 9A 68 45  ...y..|....1..hE
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   16: 71 6A D6 A9 1A 0C 00 00 01 37 1C 06 0A FF FF 03  qj.......7......
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   32: 4F 35 01 02 00 33 1A 03 01 00 2E 53 3D 32 30 46  O5...3.....S=20F
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   48: 46 45 45 38 39 43 31 31 41 39 37 36 44 45 43 34  FEE89C11A976DEC4
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   64: 38 46 42 46 44 34 44 44 31 33 32 46 43 31 36 33  8FBFD4DD132FC163
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   80: 36 39 33 35 31 50 12 D1 D9 D9 CB 8D C1 9A F8 EE  69351P..........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>   96: 40 12 C5 13 F5 CD 40 18 12 01 A0 90 AE 00 A2 8A  @[email protected]
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1>  112: DA 3E A1 21 17 0E 05 88 2C                       .>.!....,
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 51 bytes @ 0x7f56180012c0
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1>    0: 01 02 00 33 1A 03 01 00 2E 53 3D 32 30 46 46 45  ...3.....S=20FFE
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1>   16: 45 38 39 43 31 31 41 39 37 36 44 45 43 34 38 46  E89C11A976DEC48F
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1>   32: 42 46 44 34 44 44 31 33 32 46 43 31 36 33 36 39  BFD4DD132FC16369
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1>   48: 33 35 31                                         351
Jul 30 01:02:39 48[ENC] <ikev2-mschapv2|1> added payload of type EAP to message
  1. Sucesso EAP -> Resposta de Sucesso (Acesso-Aceitar):
Jul 30 01:02:39 124[ENC] <ikev2-mschapv2|1> parsed IKE_AUTH request 4 [ EAP/RES/MSCHAPV2 ]
Jul 30 01:02:39 124[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 6 bytes @ 0x7f55d80012f0
Jul 30 01:02:39 124[IKE] <ikev2-mschapv2|1>    0: 02 02 00 06 1A 03                                ......
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> => 171 bytes @ 0x7f55d8000980
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>    0: 01 A8 00 AB CA 0B A5 7E 53 26 BB 1F 7B F5 BC 66  .......~S&..{..f
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   16: BD 7B 9D 87 01 12 72 34 32 6D 33 6E 63 76 2D 65  .{....r42m3ncv-e
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00  8wfpg3=.........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D  ........W.ikev2-
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E  mschapv2...4.#..
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36  196.52.46.35..66
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 08 02 02  .207.208.226O...
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  112: 00 06 1A 03 20 13 63 61 2D 30 30 31 5F 73 74 72  .... .ca-001_str
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  128: 6F 6E 67 73 77 61 6E 18 12 01 A0 90 AE 00 A2 8A  ongswan.........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  144: DA 3E A1 21 17 0E 05 88 2C 50 12 AA 6E 35 90 03  .>.!....,P..n5..
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  160: 74 77 80 4A 2E BD FD A7 B2 C5 5B                 tw.J......[
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> received RADIUS Access-Accept from server '127.0.0.1'
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> => 182 bytes @ 0x7f55d8001750
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>    0: 02 A8 00 B6 61 C5 9A 92 51 CB DD 0B DF 37 3A 0F  ....a...Q....7:.
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   16: 83 40 AB F2 1A 0C 00 00 01 37 1C 06 0A FF FF 03  [email protected]
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   32: 1A 0C 00 00 01 37 07 06 00 00 00 01 1A 0C 00 00  .....7..........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>   48: 01 37 08 06 00 00 00 06 1A 2A 00 00 01 37 10 24  .7.......*...7.$ Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 64: E6 DC E1 89 5C 76 E8 8A BA 58 F7 7B B6 5E 62 4C ....\v...X.{.^bL Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 80: 7F EB BB C2 45 5A 6B F7 0E 01 F3 9E 0F AD 0E AE ....EZk......... Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 96: A3 92 1A 2A 00 00 01 37 11 24 ED F6 C9 A5 D7 3A ...*...7.$.....:
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  112: 0D C4 4D 93 4F 99 6E 81 28 AC B1 CE 30 DA A0 AF  ..M.O.n.(...0...
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  128: 4F 28 71 60 12 E5 35 39 04 27 A6 68 4F 06 03 02  O(q`..59.'.hO...
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  144: 00 04 50 12 C3 89 53 1A 29 FD 07 DD 11 FB 65 82  ..P...S.).....e.
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  160: 73 93 0C B2 01 12 72 34 32 6D 33 6E 63 76 2D 65  s.....r42m3ncv-e
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1>  176: 38 77 66 70 67 33                                8wfpg3

Agora, a conversa EAP com meu POC:

  1. Identidade EAP + Resposta ao Desafio
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> => 168 bytes @ 0x7fc2800019c0
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>    0: 01 56 00 A8 C3 0E 12 EC A6 1A 72 E2 3C CA 4A 78  .V........r.<.Jx
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   16: 54 E4 35 51 01 12 72 34 32 6D 33 6E 63 76 2D 65  T.5Q..r42m3ncv-e
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00  8wfpg3=.........
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D  ........W.ikev2-
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E  mschapv2...4.#..
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36  196.52.46.35..66
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 17 02 00  .207.208.226O...
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>  112: 00 15 01 72 34 32 6D 33 6E 63 76 2D 65 38 77 66  ...r42m3ncv-e8wf
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>  128: 70 67 33 20 13 63 61 2D 30 30 31 5F 73 74 72 6F  pg3 .ca-001_stro
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>  144: 6E 67 73 77 61 6E 50 12 0F F1 22 79 D1 AD DE 25  ngswanP..."y...%
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>  160: 5B 01 3D A7 19 81 8A AC                          [.=.....
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> => 100 bytes @ 0x7fc280000d20
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>    0: 0B 56 00 64 BF 61 D9 0F 42 95 2C 76 A4 41 C3 0F  .V.d.a..B.,v.A..
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   16: 59 9B A4 FA 4F 2C 01 01 00 2A 1A 01 01 00 25 10  Y...O,...*....%.
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   32: 15 C1 FB 92 B0 5A D7 64 1D 60 C5 46 69 00 DA E5  .....Z.d.`.Fi...
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   48: 72 34 32 6D 33 6E 63 76 2D 65 38 77 66 70 67 33  r42m3ncv-e8wfpg3
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   64: 18 12 15 C1 FB 92 B0 5A D7 64 1D 60 C5 46 69 00  .......Z.d.`.Fi.
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   80: DA E5 50 12 41 E8 6C 15 EF 59 DC CC A0 C7 7A A7  ..P.A.l..Y....z.
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1>   96: 3A 70 2D 82                                      :p-.
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 42 bytes @ 0x7fc280001650
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1>    0: 01 01 00 2A 1A 01 01 00 25 10 15 C1 FB 92 B0 5A  ...*....%......Z
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1>   16: D7 64 1D 60 C5 46 69 00 DA E5 72 34 32 6D 33 6E  .d.`.Fi...r42m3n
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1>   32: 63 76 2D 65 38 77 66 70 67 33                    cv-e8wfpg3
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> initiating EAP_MSCHAPV2 method (id 0x01)
  1. Resposta do pacote de solicitação EAP + pacote de sucesso (desafio de acesso):
Jul 30 00:33:24 100[ENC] <ikev2-mschapv2|1> parsed IKE_AUTH request 3 [ EAP/RES/MSCHAPV2 ]
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 75 bytes @ 0x7fc2940069c0
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>    0: 02 01 00 4B 1A 02 01 00 46 31 B2 2F A8 1C 2F 1A  ...K....F1./../.
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   16: EF 66 C0 F1 A6 B7 27 BD 51 5F 00 00 00 00 00 00  .f....'.Q_......
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   32: 00 00 64 97 7D 85 D1 6B DD 8C 82 82 A0 CB EB D7  ..d.}..k........
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   48: D8 D0 21 1C 27 96 63 7B 3D 13 00 72 34 32 6D 33  ..!.'.c{=..r42m3
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   64: 6E 63 76 2D 65 38 77 66 70 67 33                 ncv-e8wfpg3
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> => 240 bytes @ 0x7fc294003d60
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>    0: 01 7C 00 F0 DB AB 7C BF 31 2A CA A3 A1 33 93 7B  .|....|.1*...3.{
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   16: DB A4 B3 C5 01 12 72 34 32 6D 33 6E 63 76 2D 65  ......r42m3ncv-e
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00  8wfpg3=.........
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D  ........W.ikev2-
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E  mschapv2...4.#..
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36  196.52.46.35..66
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 4D 02 01  .207.208.226OM..
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  112: 00 4B 1A 02 01 00 46 31 B2 2F A8 1C 2F 1A EF 66  .K....F1./../..f
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  128: C0 F1 A6 B7 27 BD 51 5F 00 00 00 00 00 00 00 00  ....'.Q_........
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  144: 64 97 7D 85 D1 6B DD 8C 82 82 A0 CB EB D7 D8 D0  d.}..k..........
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  160: 21 1C 27 96 63 7B 3D 13 00 72 34 32 6D 33 6E 63  !.'.c{=..r42m3nc
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  176: 76 2D 65 38 77 66 70 67 33 20 13 63 61 2D 30 30  v-e8wfpg3 .ca-00
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  192: 31 5F 73 74 72 6F 6E 67 73 77 61 6E 18 12 15 C1  1_strongswan....
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  208: FB 92 B0 5A D7 64 1D 60 C5 46 69 00 DA E5 50 12  ...Z.d.`.Fi...P.
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  224: DC 26 57 40 79 91 11 FC 3F 6A C0 AD 0A 66 A0 4D  .&[email protected]?j...f.M
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> => 121 bytes @ 0x7fc294006930
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>    0: 0B 7C 00 79 35 C3 A8 F7 CC BE 84 13 5D 37 B0 66  .|.y5.......]7.f
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   16: A7 78 94 4A 1A 0C 00 00 01 37 1C 06 0A FF FF 02  .x.J.....7......
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   32: 4F 35 01 01 00 33 1A 03 01 00 2E 53 3D 33 39 39  O5...3.....S=399
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   48: 45 33 42 36 43 43 43 31 46 42 44 32 37 36 41 42  E3B6CCC1FBD276AB
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   64: 34 45 39 32 33 33 31 33 32 42 34 33 46 37 39 41  4E9233132B43F79A
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   80: 31 31 39 45 37 18 12 15 C1 FB 92 B0 5A D7 64 1D  119E7.......Z.d.
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>   96: 60 C5 46 69 00 DA E5 50 12 1F C6 29 3B 96 8E C4  `.Fi...P...);...
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1>  112: EE A4 39 67 FB 3B AE 12 8E                       ..9g.;...
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 51 bytes @ 0x7fc2940045e0
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>    0: 01 01 00 33 1A 03 01 00 2E 53 3D 33 39 39 45 33  ...3.....S=399E3
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   16: 42 36 43 43 43 31 46 42 44 32 37 36 41 42 34 45  B6CCC1FBD276AB4E
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   32: 39 32 33 33 31 33 32 42 34 33 46 37 39 41 31 31  9233132B43F79A11
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>   48: 39 45 37                                         9E7
Jul 30 00:33:24 100[ENC] <ikev2-mschapv2|1> added payload of type EAP to message

Neste ponto, nenhuma comunicação adicional é vista do cliente. Do lado do cliente, o erro 691 é mostrado. Isso significa que o cliente não conseguiu validar o Access-Challenge enviado pelo meu POC. O que se deve a um formato de pacote incorreto ou ao valor do pacote de sucesso incorreto.

Peguei os desafios do peer e do autenticador do log de sucesso e os executei em meu código para ver se posso obter a mesma saída de pacote de sucesso e ele realmente gera o mesmo valor.

Olhando para o formato do pacote byte por byte, não consigo ver nenhuma diferença no formato ou valor, ainda, o Windows rejeita esta resposta e termina a conversa EAP.

Se alguém tiver algum conhecimento profundo das implementações do Windows + EAP + MSCHAPv2, eu agradeceria muito a ajuda, pois neste ponto eu comparei os dados byte a byte e não consigo ver nenhuma diferença.

Aqui estão mais referências às RFCs implementadas:

  • Formato de pacote EAP MS-CHAPv2: http://tools.ietf.org/id/draft-kamath-pppext-eap-mschapv2-01.txt
  • EAP MS-CHAPv2: https://tools.ietf.org/html/rfc2759
  • Solicitação de acesso RADIUS: https://tools.ietf.org/html/rfc2865
  • Suporte RADIUS para protocolo de autenticação extensível: https://tools.ietf.org/html/rfc3579

Notas Adicionais:

Eu estava inicialmente suspeitando que o problema poderia estar nos pacotes RADIUS, e não nas mensagens EAP, uma vez que a carga útil do EAP parece idêntica na conversa do FreeRadius (em funcionamento) e no meu POC. O motivo pelo qual abandonei essa teoria é que os logs do cliente e do servidor mostram que o erro ocorre durante o estágio de autenticação EAP.

Pode haver algo no protocolo / pacotes RADIUS que pode afetar a validade ou aceitação das mensagens EAP pelo cliente?

Além disso, o erro é gerado durante o estágio de desafio de acesso "Pacote de sucesso" da conversa EAP, mas as etapas anteriores poderiam falhar silenciosamente e causar esse erro em um estágio posterior? Não encontrei nada em nenhuma das RFCs acima que sugira isso, mas não estou descartando nada neste momento, pois estou nisso há quase 2 semanas.

Por último, tentei obter mais informações de depuração do Windows para ver os dados exatos que o Windows está usando para determinar a validade da mensagem, mas tudo o que consegui obter no "Relatório de diagnóstico de acesso remoto" foi o seguinte:

[3004] 07-30 11:38:21:863: EapBegin(fServer=0)
[3004] 07-30 11:38:21:863: EapBegin: EapTypeToBeUsed=26, EapAuthType=2
[3004] 07-30 11:38:21:863: EapBegin: ThisIsARenegotiation=0, SaveCredsToCredMan=0, UseWinlogonCredentials=0.
[3004] 07-30 11:38:21:864: EapBegin: Connection handle: 1835008
[3004] 07-30 11:38:21:864: EapBegin: EAP user blob is not passed so using the credentials.
[3004] 07-30 11:38:21:864: fRetry = 0.
[3004] 07-30 11:38:21:865: Eap user data size: 1021.
[3004] 07-30 11:38:21:865: EapBegin done
[3004] 07-30 11:38:21:865: EapMakeMessage,RBuf=4b78910
[3004] 07-30 11:38:21:865: MakeAuthenticateeMessage...
[3004] 07-30 11:38:21:865: EAPSTATE_Initial
[3004] 07-30 11:38:21:865: EapMethodBegin(Flags=0x10, Remaining retry count=3)
[3004] 07-30 11:38:21:866: EAPSTATE_Working
[3004] 07-30 11:38:21:866: HandleEapResponse -- Entering.
[3004] 07-30 11:38:21:866: EapHost returned Action = EapHostPeerResponseSend. Processing send packet...
[3004] 07-30 11:38:21:866: RasProcessEapHostSendPacket -- Entering.
[3004] 07-30 11:38:21:866: Got identity: r42m3ncv-e8wfpg3.
[3004] 07-30 11:38:21:866: RasProcessEapHostSendPacket: Sending packet.
[3004] 07-30 11:38:21:866: RasProcessEapHostSendPacket -- Leaving: 0x0.
[3004] 07-30 11:38:21:866: HandleEapResponse -- Leaving: 0x0.
[3004] 07-30 11:38:21:869: EapMakeMessage,RBuf=4b78910
[3004] 07-30 11:38:21:869: MakeAuthenticateeMessage...
[3004] 07-30 11:38:21:869: EAPSTATE_Working
[3004] 07-30 11:38:21:870: HandleEapResponse -- Entering.
[3004] 07-30 11:38:21:870: EapHost returned Action = EapHostPeerResponseSend. Processing send packet...
[3004] 07-30 11:38:21:870: RasProcessEapHostSendPacket -- Entering.
[3004] 07-30 11:38:21:870: RasProcessEapHostSendPacket: Sending packet.
[3004] 07-30 11:38:21:870: RasProcessEapHostSendPacket -- Leaving: 0x0.
[3004] 07-30 11:38:21:870: HandleEapResponse -- Leaving: 0x0.
[3004] 07-30 11:38:21:873: EapMakeMessage,RBuf=4b78910
[3004] 07-30 11:38:21:873: MakeAuthenticateeMessage...
[3004] 07-30 11:38:21:873: EAPSTATE_Working
[3004] 07-30 11:38:21:873: HandleEapResponse -- Entering.
[3004] 07-30 11:38:21:873: EapHost returned Action = EapHostPeerResponseResult. Retreiving result...
[3004] 07-30 11:38:21:873: RasGetEapHostAuthResult -- Entering.
[3004] 07-30 11:38:21:873: RasSetQuarantineStatus -- Entering.
[3004] 07-30 11:38:21:873: ISOLATION_STATE_UNKNOWN
[3004] 07-30 11:38:21:873: RasSetQuarantineStatus -- Leaving: 0x0.
[3004] 07-30 11:38:21:873: EAP Authentication failed with error: Internal = 0x2b3, External = 0x80420112.
[3004] 07-30 11:38:21:873: RasGetEapHostAuthResult -- Leaving: 0x0.
[3004] 07-30 11:38:21:873: HandleEapResponse -- Leaving: 0x0.
[960] 07-30 11:38:21:881: EapEnd
[960] 07-30 11:38:21:881: EapMethodEnd called for EAP Index 26

Se alguém souber como obter dados de depuração úteis para EAP-MSCHAPV2 no Windows, isso também pode ser muito útil. Idealmente, eu gostaria de ver as entradas individuais para os vários cálculos realizados pela implementação do Windows, pois não vejo nenhuma razão lógica para que não funcione conforme a especificação é seguida.

2 answers

0
Geeky Masters 2020-08-12 12:21.

A combinação de StrongSwan e Windows é problemática em minha experiência. E você tem algumas variáveis. Posso não fornecer uma resposta exata, pois não conheço toda a configuração. A Microsoft gosta de cifras retro e algoritmos de hash.

Certifique-se de que o dh-group está conforme o esperado e parece haver diferença no formato da senha, isso pode estar relacionado ao Win auth e NTLM hash? E, como posso ver, os pacotes parecem ter tamanhos diferentes para o seu POC e Win, que pode ser o hash, o dh-group ou o certificado usado (descrito abaixo).

Em qualquer projeto relacionado a seguir, você poderá reutilizar as bibliotecas ou verificar sua implementação ou isso pode ajudar: https://github.com/enaess/ppp-eap-mschapv2

https://forums.freebsd.org/threads/howto-set-up-a-l2tp-ipsec-vpn-dial-in-server-part-i-to-iii.26755/

Ativa a autenticação no banco de dados de senha do sistema. Essas opções só podem ser usadas com PAP e MS-CHAP, mas não com CHAP-MD5. Se você pretende usar isso com o MS-CHAP, as senhas no master.passwd devem ser NT-Hashes. Você pode habilitar isto colocando: passwd_format = nth: em seu /etc/login.conf, mas você precisa de pelo menos FreeBSD 5.2.

Parece que também existem alguns comportamentos incomuns: https://github.com/FreeRADIUS/freeradius-server/issues/679

Não foi possível conectar a uma VPN comercial do Windows Server 2008: https://wiki.strongswan.org/issues/1252

https://wiki.strongswan.org/issues/2352

Isso ocorre porque mschapv2 requer uma implementação do algoritmo MD4, que é implementado pelo plug-in md4 e você não está carregando isso.

algumas partes também são mencionadas nos comentários para cada valor https://wiki.strongswan.org/projects/strongswan/wiki/Win7EapMultipleConfig

rightsendcert=never
Since the clients authenticate themselves using EAP-MSCHAPv2 the gateway is not going to
send any certificate requests. However, if strongSwan serves other clients using certificate
authentication, never should not be used, as a responder usually can not enforce this
option for specific connections.

eap_identity=%any
The strongSwan gateway is using the EAP Identity protocol to request an EAP identity different from
the peer's IKEv2 identity.

auto=add
The connection win7 is parsed and loaded by the the IKEv2 charon daemon but the VPN gateway will
act as a responder and passively wait for the Window 7 client to start the IKE negotiation.

Isso é descrito parcialmente no MS Docs

"A causa típica desse erro é que o NPS especificou uma condição de autenticação que o cliente não pode atender. Por exemplo, o NPS pode especificar o uso de um certificado para proteger a conexão PEAP, mas o cliente está tentando usar EAP-MSCHAPv2 . "

Certifique-se de atender a todos os requisitos, geralmente é apenas um grupo ou código errado: https://support.microsoft.com/en-us/help/2744850/implementing-peap-ms-chap-v2-authentication-for-microsoft-pptp-vpns

Não é uma resposta, é mais uma direção. Espero que ajude.

0
Domokun 2020-08-14 09:47.

Bem, eu descobri o problema. O campo Identificador EAP do Pacote de Sucesso precisava ser incrementado.

Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1>    0: 01 01 00 33 1A 03 01 00 2E 53 3D 33 39 39 45 33

O segundo octeto deveria ter sido incrementado para 02. Não encontrei menções sobre isso nas RFCs, e ainda estou intrigado por que funcionou para todas as plataformas além do Windows.

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Code      |   Identifier  |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |   OpCode      |  MS-CHAPv2-ID |  MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   MS-Length   |                    Message...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

MS-CHAPv2-ID
   The MS-CHAPv2-ID field is one octet and aids in matching MSCHAP-v2
   responses with requests.  Typically, the MS-CHAPv2-ID field is the
   same as the Identifier field.

Funciona quando você NÃO o define com o mesmo valor do Identificador EAP.

Vou publicar minhas descobertas + exemplo aqui em breve: https://github.com/Windscribe/radius

Até onde eu sei, esta é a única implementação RADIUS / EAP-MSCHAPv2 que funciona, além do FreeRadius.

Related questions

MORE COOL STUFF

Cate Blanchett dormiu com o marido depois de 3 dias juntos e ainda está casada com ele 25 anos depois

Cate Blanchett dormiu com o marido depois de 3 dias juntos e ainda está casada com ele 25 anos depois

Cate Blanchett desafiou os conselhos típicos de namoro quando conheceu o marido.

Por que Michael Sheen é um ator sem fins lucrativos

Por que Michael Sheen é um ator sem fins lucrativos

Michael Sheen é um ator sem fins lucrativos, mas o que exatamente isso significa?

Hallmark Star Colin Egglesfield Pratos Emocionantes Encontros de Fãs no RomaDrama Live! [Exclusivo]

Hallmark Star Colin Egglesfield Pratos Emocionantes Encontros de Fãs no RomaDrama Live! [Exclusivo]

A estrela da Hallmark Colin Egglesfield falou sobre emocionantes encontros com fãs no RomaDrama Live! além de seu programa INSPIRE na convenção.

Por que você não pode transmitir 'Exposição do Norte' online

Por que você não pode transmitir 'Exposição do Norte' online

Você terá que tirar o pó de um Blu-ray ou DVD player para ver por que Northern Exposure se tornou um dos programas mais populares dos anos 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

Como a matéria branca ajuda a função da matéria cinzenta do cérebro

Como a matéria branca ajuda a função da matéria cinzenta do cérebro

Todos nós já ouvimos falar da massa cinzenta do cérebro, mas e a massa branca? O que isso faz?

Doe seu cabelo para ajudar a manter nossa água limpa

Doe seu cabelo para ajudar a manter nossa água limpa

Aparas de cabelo de salões e doações pessoais podem ser reaproveitadas como tapetes que absorvem derramamentos de óleo e ajudam a proteger o meio ambiente.

Um olhar sobre os casamentos mais memoráveis ​​da Casa Branca

Um olhar sobre os casamentos mais memoráveis ​​da Casa Branca

Apenas algumas pessoas se casaram na Casa Branca nos últimos 200 anos. Quem eram eles e o que é necessário para marcar um casamento lá?

É claro que a nova advogada de Harvey Weinstein é uma mulher que critica MeToo

É claro que a nova advogada de Harvey Weinstein é uma mulher que critica MeToo

O demorado julgamento de agressão sexual de Harvey Weinstein deve começar a seleção do júri em setembro e, em antecipação, ele reorganizou sua equipe jurídica pela terceira vez. Talvez inevitavelmente, seus advogados agora incluem a advogada de defesa Donna Rotunno, que é mais conhecida por representar homens acusados ​​de agressão sexual, questiona o movimento MeToo como um todo e disse em entrevistas anteriores que seu gênero permite que ela saia com mais "veneno" ao interrogar acusadores.

Economize até $ 700 em um TreadClimber, além de um tapete grátis e frete grátis

Economize até $ 700 em um TreadClimber, além de um tapete grátis e frete grátis

Venda Bowflex TreadMaster | Bowflex | Código promocional HELLOWINTER Se você ainda não desistiu de suas resoluções de fitness de ano novo, você pode economizar até $ 700 na assinatura do Bowflex TreadClimber hoje com o código promocional HELLOWINTER, mais um tapete e frete grátis (que normalmente custa $ 200). Você pode escolher entre o TreadClimber TC200 de última geração ou o TC100 mais acessível para este negócio, e Bowflex fornece um gráfico de comparação útil aqui para ajudá-lo a decidir.

Ex-assistente de Harvey Weinstein diz que era um 'mestre manipulador'

Ex-assistente de Harvey Weinstein diz que era um 'mestre manipulador'

Em entrevista à BBC News, a ex-assistente de Harvey Weinstein, Zelda Perkins, deixa clara a realidade de enfrentar o magnata de Hollywood. Era, ela diz, basicamente impossível.

10 razões pelas quais Sean 'Diddy' Combs comprar o Carolina Panthers precisa ser uma coisa

10 razões pelas quais Sean 'Diddy' Combs comprar o Carolina Panthers precisa ser uma coisa

Frank Micelotta / Getty Images Acontece que a franquia Carolina Panthers da NFL está prestes a ser colocada à venda. O atual proprietário, Jerry Richardson, vai colocar o clube à venda depois que vários relatórios de pagamentos feitos a vítimas de má conduta sexual foram divulgados pela Sports Illustrated.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Carne de porco Mapo de Dawn Burrell e homus de Edamame

Carne de porco Mapo de Dawn Burrell e homus de Edamame

"Esta é uma indústria dominada por homens, e estou feliz por ser uma das pessoas que quebrou o molde para ajudar as mulheres de cor", diz Top Chef: finalista de Portland e chef-parceiro do final de agosto em Houston. "Muitas vezes somos ignorados e às vezes não ensinados, mas isso vai mudar."

Kate Middleton passa um dia à beira da água em Londres, além de Jennifer Lopez, Julianne Hough e mais

Kate Middleton passa um dia à beira da água em Londres, além de Jennifer Lopez, Julianne Hough e mais

Kate Middleton passa um dia na água em Londres, além de Jennifer Lopez, Julianne Hough e muito mais. De Hollywood a Nova York e em todos os lugares, veja o que suas estrelas favoritas estão fazendo!

Jovem de 17 anos esfaqueado até a morte enquanto outros 4 ficaram feridos em um ataque de faca no rio Wisconsin

Jovem de 17 anos esfaqueado até a morte enquanto outros 4 ficaram feridos em um ataque de faca no rio Wisconsin

Investigadores estão investigando se o grupo e o suspeito se conheciam antes do ataque

Como eu escrevo

Como eu escrevo

Para mim, tudo é sobre aquela primeira linha e onde ela te leva. Alguns escritores são movidos pelo enredo, pelo delicado arranjo das peças de xadrez, enquanto outros são atraídos por um personagem e pela capacidade de viajar com um novo amigo fictício.

Aterrissagens na pista

Aterrissagens na pista

O final do verão e o outono são estações nostálgicas. Os postes de luz lançam sua luz sobre as ruas escorregadias pela chuva, e as folhas sob os pés – vermelho-alaranjado nas sombras do crepúsculo – são um lembrete de dias passados.

Imagine criar uma estratégia de conteúdo que realmente CONVERTE. É possível.

Imagine criar uma estratégia de conteúdo que realmente CONVERTE. É possível.

Em 2021, encorajo você a repensar tudo o que sabe sobre os clientes que atende e as histórias que conta a eles. Dê um passo para trás.

Uma perda gigantesca abriu meu coração para o amor

Uma perda gigantesca abriu meu coração para o amor

No dia do aniversário de 9 anos de Felix The Cat, lembro-me de uma das maiores perdas da minha vida adulta – minha Sophie em 2013. Escrevi este ensaio e o compartilhei brevemente nesta plataforma em 2013.

Language